/ / ओवरराइड Django फॉर्मेट डिलीट बिहेवियर: अगर Django मॉडल फॉर्मेट - django, formet में खाली फील्ड है तो फॉर्म इंस्टेंट को डिलीट कर दें

Django फॉर्मेट को ओवरराइड करें व्यवहार को हटाएं: Django मॉडल formet - django, formet में खाली फ़ील्ड के रूप में फॉर्म उदाहरण हटाएं

मैं अक्सर इसमें भाग लेता हूं:

मैं फॉर्मेट में डिफ़ॉल्ट डिलीट बॉक्स को छुपाना चाहता हूं और किसी निश्चित क्षेत्र को फॉरमेट के प्रत्येक फॉर्म में क्लीयर होने पर ऑब्जेक्ट का उदाहरण हटाना है।

विशिष्ट समस्या यह है कि, या तो सत्यापन रास्ते में हो जाता है या यह रिक्त प्रपत्र का पता लगाता है और सभी प्रकार (यहां तक ​​कि अतिरिक्त अतिरिक्त) को जोड़ना शुरू कर देता है जब फॉर्मेट बच जाता है।

उत्तर:

उत्तर № 1 के लिए 4

यहाँ समाधान है जो मैंने पाया:

यह कोड एक मॉडल फॉर्मेट बनाता है, यह सुनिश्चित करता है कि यह रिक्त क्षेत्र की अनुमति देकर मान्य होता है, और फिर सहेजने पर यह निर्धारित करता है कि किन वस्तुओं को हटाना है और किन रूपों को सहेजना है।

TaskFormset = inlineformset_factory(User, FAQ, extra=3, can_delete=False, exclude=("user", "answer",))
formset = TaskFormset(request.POST, request.FILES, instance=user)
for form in formset:
form.fields["question"].required = False

// later when performing the formset save

for form in formset:
if form.instance.pk and form.cleaned_data["question"].strip() == "":
form.instance.delete()
elif form.cleaned_data:
form.save()

जवाब के लिए 0 № 2

वहाँ पर एक विधि है BaseFormSet बुलाया _should_delete_form जो अपने मापदंड के आधार पर स्वचालित रूप से एक इंस्टेंस को हटाना आसान बनाता है, हालांकि यह एक "निजी" तरीका है ताकि भविष्य के समर्थन के बारे में सुनिश्चित न हो। आपको कॉल करके भी फॉर्मेट्स को सहेजना होगा। formset.save().

नीचे दिए गए उदाहरण में यदि सभी पंक्ति को हटा दिया जाएगा fields मूल्य गलत मूल्यों का मूल्यांकन करते हैं।

class MyFormSet(forms.BaseInlineFormSet):
def _should_delete_form(self, form):
"""Return whether or not the form should be deleted."""
if form.cleaned_data.get(forms.formsets.DELETION_FIELD_NAME):
return True  # marked for delete
fields = ("name", "question", "amount", "measure", "comment")
if not any(form.cleaned_data[i] for i in fields):
return True
return False