2010-01-01 31 views
9

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

यहां मेरा कोड है और मेरी समस्या यह है कि यह हमेशा एक नया 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), 
    ) 

संपादित करें:

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

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

@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),) 

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

उत्तर

11

बजाय modelformset_factory उपयोग करते हैं, inlineformset_factory का उपयोग करें - the documentation here देखते हैं - खेद है, आपको लगता है कि करने के लिए शुरू में बताया जाना चाहिए था।

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

+0

आज बहुत कुछ सीख Thanks..I :) मैं एक त्रुटि इस दृष्टिकोण के साथ भी मिलता है:/सीआरएम/संपर्क/15/ पर IndexError - सीमा से बाहर सूची सूचकांक .. उम्मीद है कि मैं inlineformset_factory –

+0

ठीक है के साथ इसे से छुटकारा पाने के काम करने लगता है। मैंने अभी फोन नंबर ऑब्जेक्ट्स के लिए कोशिश की है। और वाह .. मुझे प्रत्येक इनलाइन ऑब्जेक्ट के लिए वास्तव में एक अच्छा डिलीट चेकबॉक्स मिला .. wuhaa :) लेकिन एक प्रश्न: क्या इनलाइन ऑब्जेक्ट्स के max_num को परिभाषित करने का कोई तरीका है? चूंकि यह हमेशा तीन और इनलाइन जोड़ता है। –

+0

आह ठीक है, "सामान्य" रूपों के समान समाधान। max_num = 3 या अतिरिक्त = 0 –

संबंधित मुद्दे