5

मेरे forms.py:एक ही टेम्पलेट पर दो अलग Django फॉर्म का उपयोग कैसे करें?

class AlertForm(forms.ModelForm): 
class Meta: 
    model=Alert 
    fields = ('high','medium', 'user') 
    widgets = { 
     'user': forms.HiddenInput() 
    } 

AlertCountFormset = modelformset_factory(Alert, 
             form = AlertForm) 

एक और Django फार्म वर्ग:

NOTIFIER_TYPE = (
(0, _('E-mail')), 
(1, _('Skype')), 
(2, _('IRC')) 
) 

मैं एक ही पर इन दो रूपों भरना चाहते हैं:

class NotifierForm(forms.ModelForm): 
high = forms.ChoiceField(choices=NOTIFIER_TYPE) 
medium = forms.ChoiceField(choices=NOTIFIER_TYPE) 
low = forms.ChoiceField(choices=NOTIFIER_TYPE) 

def save(self, commit=True): 
    alert = super(NotifierForm, self).save(commit=False) 
    alert.high = self.cleaned_data["high"] 
    alert.medium = self.cleaned_data["medium"] 
    alert.low = self.cleaned_data["low"] 
    alert.save() 
    return alert 

class Meta: 
    model=Notifier 
    fields = ('high','medium', 'low', 'user') 
    widgets = { 
     'user': forms.HiddenInput() 
    } 

NotifierFormset = modelformset_factory(Notifier, 
            form = NotifierForm) 

नीचे चुनाव क्षेत्रों के लिए है टेम्पलेट। तो मैं दोनों अर्थात के लिए एक ही बार देखा गया लिखने के लिए चुनें:

def profile_setting(request, slug): 
if request.method == 'POST': 
    alert_form = AlertForm(request.POST) 
    notifier_form = NotifierForm(request.POST) 
    if alert_form.is_valid() and notifier_form.is_valid(): 
     alert = alert_form.save(commit=False) 
     notifier = notifier_form.save(commit=False) 
     alert.user = request.user.username 
     notifier.user = request.user.username 
     notifier.save() 
     alert.save() 
     return HttpResponseRedirect(reverse('profile_setting', args=[slug])) 

extra_context = { 
    'alert_form': AlertForm(), 
    'notifier_form': NotifierForm() 
} 
return direct_to_template(request,'users/user_profile_setting.html', 
          extra_context) 

कि मेरे template.html में के अनुसार:

{% block content %} 
<h3>{% trans "Alerts limit" %}</h3> 
<form action="" method="POST">{% csrf_token %} 
    {{ alert_form.as_p }} 
    <input type="submit" value="{% trans 'Update' %}" /> 
</form> 

<h3>{% trans "Notifier setting" %}</h3> 
<form action="" method="POST">{% csrf_token %} 
    {{ notifier_form.as_p }} 
    <input type="submit" value="{% trans 'Update' %}" /> 
</form> 

सब कुछ सही है, यह भी डेटाबेस के लिए डेटा की बचत है। लेकिन समस्या यह है कि जब भी मैं aler_form भरता हूं और अद्यतन बटोन पर क्लिक करता हूं। यह एक ही मूल्य या इसके विपरीत के साथ एक और रूप भी अद्यतन करता है। उदाहरण के लिए यदि मैं

1 2 3 for high , medium and low for alert_Form 

फिर यह notify_form के लिए समान मान भी सहेजता है। ये क्यों हो रहा है। क्या यह विचारों में कुछ गलत है?

उत्तर

12

prefix तर्क का उपयोग करें ताकि आपके फ़ील्ड नाम संघर्ष न करें।

उदाहरण के लिए:

alert form = AlertForm(request.POST, prefix='alert') 
notifier_form = NotifierForm(request.POST, prefix='notifier') 

आप अपने अनबाउंड रूपों में एक ही उपसर्ग का उपयोग करने की जरूरत है।

extra_context = { 'alert_form': AlertForm(prefix='alert'), notifier_form': NotifierForm(prefix='notifier') } 

उपसर्ग उपयोग करने का लाभ यह है कि आप, के रूप में umnik700 उनके जवाब में पता चलता है मैन्युअल रूप से क्षेत्रों का नाम बदलने की आवश्यकता नहीं है।

+0

उन परिवर्तनों के अलावा। क्या मुझे टेम्पलेट पक्ष में बदलाव करना चाहिए या नहीं? –

+0

नहीं, आपको टेम्पलेट में कोई भी परिवर्तन करने की आवश्यकता नहीं है। इसे जोड़ने के बाद – Alasdair

+0

। कुछ नही हो रहा है। मेरा मतलब है, डेटाबेस में कोई मूल्य दर्ज नहीं है। यहां तक ​​कि –

3

समस्या यह है कि आपके रूपों पर फ़ील्ड के समान नाम हैं।

अनुरोध। POST एक शब्दकोश-जैसी वस्तु है। इसलिए इसमें अनुरोध से नाम/मूल्य जोड़े शामिल हैं। यदि फ़ील्ड नाम दोनों रूपों पर समान होते हैं तो जब आप

alert_form = AlertForm(request.POST) 
notifier_form = NotifierForm(request.POST) 

पर कॉल करते हैं तो वे समान मानों के साथ प्रारंभ होते हैं। इसे हल करने के लिए नाम आपके दो रूपों के बीच अद्वितीय बनें। उदाहरण के लिए अलर्टफॉर्म पर "alert_" के साथ सभी फ़ील्ड नामों को उपसर्ग करें।

+0

क्षमा करें मुझे आपको नहीं मिला। कौन से दो नाम? –

+0

उत्तर देने के लिए धन्यवाद :) एक और बात। क्या यह Django-Form में संभव है, जब भी मैं फॉर्म में अपने सभी फ़ील्ड अपडेट करने जा रहा हूं। सभी फ़ील्ड डेटाबेस में पिछले सहेजे गए मान को दिखाना चाहिए। –

+1

हां, यह संभव है। अतिरिक्त_कॉन्क्स्ट जिसमें दो रूप उदाहरण होते हैं। वे जिस तरह से आप इसे अभी करते हैं, क्या आप अनियमित रूपों को पार करते हैं। यदि आप डेटा को प्रदर्शित करना चाहते हैं तो आपको उन्हें निष्क्रिय करने की आवश्यकता है। –

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

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