使用inlineformset\u factory和Jquery AJAX编辑具有外键的表条目

2024-09-29 21:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在Django开发一个简单的通讯录应用程序。我想有一个单一的联系人姓名与任何数量的地址通过外键连接到该联系人…足够简单

我的问题是,当inlineformset被发布到服务器时,它总是添加一个新的表条目,尽管表单被正确加载和初始化

例如,若一个联系人有一个工作地址和家庭地址,而我试图“编辑”现有的工作地址…POST视图会创建一个包含所有更新信息的第二个工作地址,那个么我试图编辑的原始条目仍然存在,未被触动。这是我的密码…我遗漏了什么

Model.py

class ContactForm(forms.ModelForm):
       class Meta:
       model = Contact
       fields = ('__all__')

class AddressForm(forms.ModelForm):
       class Meta:
       model = Address
       fields = ('contact','address_name')

AddressFormSet = modelformset_factory(
    Address,
    AddressForm,)

AddressInlineFormSet = inlineformset_factory(
    Contact,
    Address,
    fields=('address_name',),
    extra=0,
    min_num=1,
    max_num=1,
    can_delete=True)

My POST conditional in My views.py我的帖子

我想这就是问题所在…当我编辑时,如何将窗体地址与地址条目对齐

        if request.method == 'POST':

        ## On a POST, Retrieve the QueryDict data coming from AJAX POST
        JSON_Datalist = request.POST
        ## Convert the Data to a Dict
        jsonString = json.loads( json.dumps(JSON_Datalist))
        formdata = jsonString['form_data']
        ## Load the cleaned list into a Dict
        formdata_dict = json.loads(formdata)

        if formdata_dict['address_set-0-contact'] is not None:
            contact = get_object_or_404(Contact, pk=formdata_dict['address_set-0-contact'])

        contactformset = ContactForm(data=formdata_dict, instance=contact)

        # Have we been provided with a valid form?
        if contactformset.is_valid():
            # Save the new contact to the database.
            contactformset.save()

            addressformset=AddressInlineFormSet(data=formdata_dict,queryset=contactformset.instance.address_set.all(),instance=contact)

            if addressformset.is_valid():
                addressformset.save(commit=False)
                addressformset.contact=contact
                addressformset.save()
            else:
                print("Address Form is NOT Valid")
                print addressformset.errors

            return render(request, 'address_book/address_book.html', contacts_dict)
        else:
            # The supplied form contained errors - just print them to the terminal.
            if not contact_form.is_valid():
                print("Contact Form errors")
                print(contact_form)
                print("")
            if not addressformset.is_valid():
                print("Address Form errors")
                print(addressformset)

Jquery w/AJAX

if(buttonValue == 'UpdateButton') {
        $( 'form' ).submit(function( event ) {
            var $form = ( $(this) ).serializeArray(),
                formdata = { },
                JSONformdata;
            //Prevent Page refresh
            event.preventDefault(); 
            //Build Dictionary
            $.each($form, function(key, value) {
                formdata[value.name] = value.value;
            });
            JSONformdata = JSON.stringify(formdata);
            $.post({
                    url:'/addressbook/',
                    data: { 
                        form_data : JSONformdata,
                        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
                    },
                success: function(json) {
                    $('form#entry_form').remove();
                    console.log("success post")
                }
            })
            .fail(function() {
            console.log("failure");
            })
        }) ;
    }

Tags: theformdataifisaddress地址contact

热门问题