I have a helper function to save a formset for the model Fields.
This function does not save any records, unless I remove a specific piece of code.
code that does not save:
@transaction.atomic
def update_fields_and_fields_group(formset, fg_id, fg_name, ordered_ids):
fg = FieldsGroup.objects.get(pk=fg_id)
fg.name = fg_name
fg.save()
# store fields as dictionary
fields_list = Fields.objects.filter(fields_group__pk=fg_id)
fields_dict = {}
for f in fields_list:
fields_dict[f.id] = f
num_fields = len(fields_dict)
# save values
instances = formset.save(commit=False)
print(instances)
for fields in instances:
# populate order for new fields with order at the end
if not fields.id:
fields.order = num_fields + 1
# populate FK
fields.fields_group_id = fg_id
print(fields.id)
fields.save()
# save order
current_order = 1
for id in ordered_ids:
# id is none for new rows
if id == 'None':
continue
fields = fields_dict[int(id)]
fields.order = current_order
current_order += 1
fields.save()
code that does save:
@transaction.atomic
def update_fields_and_fields_group(formset, fg_id, fg_name, ordered_ids):
fg = FieldsGroup.objects.get(pk=fg_id)
fg.name = fg_name
fg.save()
# store fields as dictionary
# fields_list = Fields.objects.filter(fields_group__pk=fg_id)
# fields_dict = {}
# for f in fields_list:
# fields_dict[f.id] = f
# num_fields = len(fields_dict)
# save values
instances = formset.save(commit=False)
print(instances)
for fields in instances:
# populate order for new fields with order at the end
# if not fields.id:
# fields.order = num_fields + 1
# populate FK
fields.fields_group_id = fg_id
print(fields.id)
fields.save()
# save order
# current_order = 1
# for id in ordered_ids:
# # id is none for new rows
# if id == 'None':
# continue
# fields = fields_dict[int(id)]
# fields.order = current_order
# current_order += 1
# fields.save()
How I'm using these helpers in my view:
if formset.is_valid():
try:
ordered_ids = request.POST.get("fields_orders")
ordered_ids = ordered_ids.split(", ")
update_fields_and_fields_group(formset, fields_group_id, fields_group_name, ordered_ids)
messages.success(request, "success")
except Exception as e:
messages.error(request, e)
Does calling Fields.objects.filter interfere with the save logic in some way?