Django formset-कैसे एक वस्तु को अद्यतन करने के लिए?



django-forms (1)

मैं request.POST का उपयोग कर एक फ़ॉर्मेट से एक ऑब्जेक्ट कैसे अपडेट कर सकता हूं?

यह मेरा कोड है और मेरी समस्या यह है कि यह हमेशा एक नया PhoneNumber वस्तु बनाता है लेकिन मैं पुराने PhoneNumber ऑब्जेक्ट को अपडेट करना चाहता हूं।

def contact_detail(request, contact_id):
    contact = get_object_or_404(Contact, pk=contact_id)
    phone_number_list = PhoneNumber.objects.filter(contact=contact_id)

    if request.method == 'POST':
        cform = ContactForm(request.POST, instance=contact)
        #the next line is probably wrong!
        phonenumberformset = PhoneNumberFormSet(request.POST, queryset=phone_number_list)

        if cform.is_valid() and phonenumberformset.is_valid():
            phonenumber_instances = phonenumberformset.save(commit=False)
            for phonenumber in phonenumber_instances:
                phonenumber.contact = contact
                phonenumber.save()

            request.user.message_set.create(message='The contact "%s" was chanced successfully.' % contact.__str__())
            return HttpResponseRedirect("/crm/contacts/?oby=1")
    else:
        cform = ContactForm(instance=contact)
        phonenumberformset = PhoneNumberFormSet(queryset=phone_number_list)

    return render_to_response(
        'crm/contact_detail.html',
        {'cform': cform, 'phonenumberformset': phonenumberformset,},
        context_instance = RequestContext(request),
    )

संपादित करें: मैं तीन PhoneNumberForms बनाएँ:

PhoneNumberFormSet = modelformset_factory(PhoneNumber, max_num=3, extra=3, exclude=('contact',))

संपादित करें: inlineformset_factory का उपयोग कर समाधान:

@login_required
def contact_detail(request, contact_id):
    contact = get_object_or_404(Contact, pk=contact_id)
    PhoneNumberInlineFormSet = inlineformset_factory(Contact, PhoneNumber, max_num=3)

    if request.method == 'POST':
        cform = ContactForm(request.POST, instance=contact)
        classificationformset = ClassificationInlineFormSet(request.POST, request.FILES, instance=contact)
        addressformset = AddressInlineFormSet(request.POST, request.FILES, instance=contact)
        phonenumberformset = PhoneNumberInlineFormSet(request.POST, request.FILES, instance=contact)
        if cform.is_valid() and phonenumberformset.is_valid():
            contact = cform.save()
            phonenumberformset.save()

            request.user.message_set.create(message='The contact "%s" was chanced successfully.' % contact.__str__())
            return HttpResponseRedirect("/crm/contacts/?oby=1")
    else:
        cform = ContactForm(instance=contact)
        phonenumberformset = PhoneNumberInlineFormSet(instance=contact)

return render_to_response(
        'crm/contact_detail.html',
        {'cform': cform, 'phonenumberformset': phonenumberformset,},
        context_instance = RequestContext(request),)

यह दृष्टिकोण प्रत्येक इनलाइन रूप में एक चेक चेकबॉक्स को भी जोड़ता है। आसान और महान


modelformset_factory उपयोग करने के बजाय, modelformset_factory उपयोग करें - यहां दस्तावेज़ीकरण देखें - क्षमा करें, आपको शुरूआत में उस पर ध्यान देना चाहिए था

तब आप क्वेरीस सामग्री को छोड़ सकते हैं, चूंकि इनलाइनफॉर्मसेट_नेटिक उसके बारे में ध्यान रखता है, और बस instance तर्क (जो यहां मूल मॉडल को संदर्भित करता है, अर्थात Contact ऑब्जेक्ट) को पारित करता है। आपको सहेजने पर संपर्क विशेषता को स्पष्ट रूप से सेट करने के माध्यम से इसे फिर से चलाने की ज़रूरत नहीं होगी, फिर भी इसका ध्यान रखा गया है।





django-forms