2012-09-13 15 views
7

मेरे पास एक वेब पेज है जहां उपयोगकर्ता गतिशील रूप से django प्रारूपों में रूपों को जोड़ और हटा सकते हैं।मॉडल फॉर्मेट से गतिशील रूप से हटाएं django

मैंने Dynamically adding a form to a Django formset with Ajax पढ़ा है, जिसके आधार पर मैं फॉर्मेट को गतिशील रूप से फॉर्म जोड़ सकता हूं। अब मैं गतिशील रूप से फॉर्मेट को हटाना चाहता हूं। मैंने Dynamically Delete inline formsets in Django

जिस तरह से मैं इसे करना चाहता हूं वह तब होता है जब उपयोगकर्ता डिलीट पर क्लिक करता है, मेरे पास एक AJAX फ़ंक्शन है जो डेटाबेस से फॉर्म इंस्टेंस रिकॉर्ड हटा देता है। जब मेरा AJAX फ़ंक्शन देता है तो मैं वही कुल_form_count और प्रारंभिक_form_count रखता हूं और केवल HTML HTML को छुपाता हूं ताकि हटाए गए रिकॉर्ड को भी मेरे पोस्ट में सबमिट किया जा सके।

प्रारंभ में formset के रूप में अपनी फार्म तत्वों renders:

#form0 
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id"> 
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field"> 
#form1 
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id"> 
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field"> 
#form2 
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id"> 
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field"> 

अब मैं गतिशील, प्रपत्र 0 हटाना ajax का उपयोग कर, के बाद मेरे रिकॉर्ड नष्ट कर रहा है, मैं रूप में गिना जाता है में परिवर्तन नहीं करते लगता है, तो total_form_count और initial_form_count 3.

(यदि मैं इस मामले में कुल_form_count और प्रारंभिक_form_count को 2 से कम करता हूं, जब मैं POST डेटा का उपयोग करके अपने दृश्य में फॉर्मेट को पॉप्युलेट करता हूं, तो इसे फॉर्म 0 और फॉर्म 1 के रूप में आदेश दिया जाने की उम्मीद है। लेकिन मेरे मामले में मान्य रूप फॉर्म 1 और फॉर्म 2 हैं)

अब मेरे विचार में, मैं अपना फॉर्म सहेजने के लिए निम्न की तरह कुछ करता हूं।

myformset = modelformset_factory(ObjectElement,form=Object_Form, extra=0, can_delete=True) 
for form in myformset.forms: 
    print(form.instance.id) #this does not print id of deleted record, but of the first existing record in the database. 
    print(form.instance.attribute)# this prints the correct element, which was submitted by POST even for a deleted record. 
    try: 
     objectInstance = ObjectElement.objects.get(id = form.instance.id) 
     objectInstance.save() 
    except ObjectElement.DoesNotExist: 
     print("Do not save as the record has already been deleted")  

जब मैं किसी भी रिकॉर्ड को हटाने के बिना मेरे formset को बचाने की बचत ठीक काम करता है और सही form.instance.id छपा है। हालांकि अगर मैं AJAX का उपयोग करके एक फॉर्म उदाहरण हटा देता हूं, और फिर हटाए गए रिकॉर्ड के लिए print(form.instance.id) डेटाबेस को सहेजने का प्रयास करता है, तो डेटाबेस में पहली उपलब्ध आईडी मुद्रित करना प्रतीत होता है, लेकिन पोस्ट द्वारा सबमिट की गई आईडी नहीं। (जैसा कि रिकॉर्ड हटा दिया गया है, आईडी डेटाबेस में मौजूद नहीं है, लेकिन क्या इसे पोस्ट सही के माध्यम से सबमिट किया जाना चाहिए?)

यदि मैं इसे कोशिश/पकड़ लूप के बिना करता हूं तो मुझे निम्न त्रुटि मिलती है form.errors:

<ul class="errorlist"><li>id<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul> 

जो संकेत मिलता है कि इसे स्वीकार सही रूप आईडी फार्म नष्ट कर दिया रिकार्ड के लिए प्रस्तुत पोस्ट नहीं कर रहा है लगता है।

किसी भी शरीर को यह पता नहीं है कि मैं यहां क्या खो रहा हूं? या ऐसा करने का एक बेहतर तरीका है।

कैसे के बारे में हम गतिशील, formsets से रूपों को हटाने जाने के रूप में ऐसा लगता है कि रूपों के आदेश अनुक्रमिक होना चाहिए ..

धन्यवाद अग्रिम में !! किसी भी मदद की सराहना की है।

उत्तर

9

जो इस मुद्दे पर ठोकर खा रहे हैं, उनके लिए यह एक संभावित समाधान हो सकता है, मैं निम्न रूप से फॉर्मेट से अपना फॉर्म डायनामिक रूप से हटा सकता हूं।

तो प्रारंभिक रूप एचटीएमएल लगता है कि

#form0 
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id"> 
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field"> 
#form1 
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id"> 
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field"> 
#form2 
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id"> 
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field"> 

अब मैं ajax का उपयोग कर मेरे डेटाबेस से form0 और Form1 रिकॉर्ड हटाएं लगता है। जब मैं फॉर्म जमा करता हूं, तो फॉर्मेट मान्य नहीं होगा, क्योंकि यह अपेक्षा करता है कि फ़ॉर्म क्रम में हों, और मेरे पास डेटा बेस में केवल 2 शेष शेष हैं (मैंने शीर्ष दो को हटा दिया है)।प्रश्न में वर्णित अनुसार "वैध विकल्प का चयन करें" के साथ फ़ॉर्मसेट त्रुटियां।

तो बाद मैं रूपों गतिशील हटा देते हैं, जब मेरे ajax रिटर्न, मैं total_form_count, (https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#understanding-the-managementform) बदल सकता हूँ नहीं लेकिन के रूप में अपने html में नष्ट कर दिया प्रपत्र निशान, और बस प्रपत्र को छिपाने। अब जब POET का उपयोग करके फ़ॉर्मेट सबमिट किया जाता है, तो यह हटाए गए फॉर्म को भी सबमिट करता है, लेकिन हटाए गए (https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#can-delete)

अब दृश्य में, मैं पहले हटाए गए फॉर्म को फ़िल्टर करता हूं, और केवल उन फ़ॉर्मों को संसाधित करता हूं जो अभी भी निम्नानुसार

marked_for_delete = formset.deleted_forms 
    for form in formset.forms: 
     #Filtering out the deleted records, as the formset will not validate, for deleted records 
     # if we use form.instance.id or form.initial['id'] below it does not work. 
     #for some reason it returns the id of the first available record in the data base. 
     #form['id'].value(), gives us the id of the deleted element we are looking for 
     if form['id'].value() not in [deleted_record['id'].value() for deleted_record in marked_for_delete]:  
      if form.is_valid(): 
       pass 
       # save the form 
      else: 
       pass 
       # error message 
+0

आप प्रत्येक फ़ॉर्म को हटाने के लिए बिल्कुल कैसे चिह्नित करते हैं? – amchugh89

+0

@ amchugh89 ठीक है तो मुझे विश्वास है कि मैंने देखा [यह] (https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#can-delete)। लेकिन [नए संस्करण] (https://docs.djangoproject.com/en/1.7/topics/forms/formsets/#understanding-the-managementform) निर्दिष्ट करते हैं कि आप पोस्ट में 'फॉर्म - # - DELETE' सहित हटाए जाने के लिए चिह्नित कर सकते हैं डेटा। – akotian

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