Django formset not saving with particular code

Viewed 27

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?

0 Answers
Related