दिलचस्प पोस्ट
जावा: अनसुलझे संकलन समस्या फ्लोटिंगएक्शनबटन उदाहरण का समर्थन लाइब्रेरी के साथ एक ही कक्षा में किसी अन्य ऑब्जेक्ट के निजी क्षेत्र में प्रवेश करें एक बार सभी के लिए, कैसे वापस सही ढेर में आवृत्तियों की स्थिति राज्य को बचाने के लिए? सी ++ में फास्ट टेक्स्टफ़ाइल पढ़ने यूट्यूब एपीआई – निकालें वीडियो आईडी ऑब्ज़र्वबल कलेक्शन और बाइंडिंगलिस्ट में अंतर कैसे अजगर दुभाषिया को सही ढंग से स्ट्रिंग ऑपरेशन में गैर- ASCII वर्णों को संभालना? `नया फ़ंक्शन () 'कम केस के साथ" f "जावास्क्रिप्ट में जीमेल त्रुटि: एसएमटीपी सर्वर को एक सुरक्षित कनेक्शन की आवश्यकता होती है या क्लाइंट को प्रमाणित नहीं किया गया था। सर्वर प्रतिक्रिया थी: 5.5.1 प्रमाणीकरण आवश्यक मैं गिट को अपनी पसंद के संपादक का उपयोग करने के लिए कैसे करूं? मैं कई प्रारूपों के दोहराव वाले उपायों को विस्तृत प्रारूप में कैसे फैल सकता हूं? एसआईसी या एसएसएच का इस्तेमाल करते हुए एक पायथन में एक रिमोट सर्वर पर एक फाइल कॉपी कैसे करें? क्रॉस-ब्राउज़र XmlHttpRequest को पुनः प्राप्त करने का सबसे आसान तरीका Windows Scipy स्थापित करें: कोई Lapack / Blas संसाधन नहीं मिला

Django में एक पृष्ठ पर एकाधिक रूपों को प्रबंधित करने का उचित तरीका

मेरे पास दो रूपों की उम्मीद वाला टेम्पलेट पृष्ठ है अगर मैं सिर्फ एक रूप का उपयोग करता हूं, तो इस विशिष्ट उदाहरण में चीजें ठीक हैं:

if request.method == 'POST': form = AuthorForm(request.POST,) if form.is_valid(): form.save() # do something. else: form = AuthorForm() 

अगर मैं कई रूपों के साथ काम करना चाहता हूं, तो मैं कैसे यह बताना चाहूंगा कि मैं केवल एक फार्म सबमिट कर रहा हूं और दूसरा नहीं (अर्थात यह अभी भी अनुरोध है। POST, लेकिन मैं केवल उस फॉर्म पर प्रक्रिया करना चाहता हूं जिसके लिए सबमिट करें हो गई)?


यह उस उत्तर के आधार पर समाधान है जहां उम्मीद की गईंफ़्रेज़ और बन्दफायड विभिन्न रूपों के लिए सबमिट बटनों के नाम हैं और अपेक्षितफ्रासेफॉर्म और प्रतिबंधित फीफोरेफॉर्म फॉर्म हैं।

 if request.method == 'POST': if 'bannedphrase' in request.POST: bannedphraseform = BannedPhraseForm(request.POST, prefix='banned') if bannedphraseform.is_valid(): bannedphraseform.save() expectedphraseform = ExpectedPhraseForm(prefix='expected') elif 'expectedphrase' in request.POST: expectedphraseform = ExpectedPhraseForm(request.POST, prefix='expected') if expectedphraseform.is_valid(): expectedphraseform.save() bannedphraseform = BannedPhraseForm(prefix='banned') else: bannedphraseform = BannedPhraseForm(prefix='banned') expectedphraseform = ExpectedPhraseForm(prefix='expected') 

वेब के समाधान से एकत्रित समाधान "Django में एक पृष्ठ पर एकाधिक रूपों को प्रबंधित करने का उचित तरीका"

आपके पास कुछ विकल्प हैं:

  1. दो रूपों के लिए कार्रवाई में अलग यूआरएल रखें। फिर दो अलग-अलग रूपों से निपटने के लिए आपके पास दो भिन्न दृश्य फ़ंक्शन होंगे।

  2. POST डेटा से सबमिट बटन मान पढ़ें आप बता सकते हैं कि किस सबमिट बटन पर क्लिक किया गया था: मैं एकाधिक सबमिट किए गए डीजेंगो फ़ॉर्म कैसे बना सकता हूं?

भविष्य के संदर्भ के लिए एक विधि ऐसा कुछ है बंदीफाफ़ाफॉर्म पहला फॉर्म है और अपेक्षितफ्रासेफॉर्म दूसरा है। अगर पहले हिट हो जाता है, तो दूसरे को छोड़ दिया जाता है (जो इस मामले में उचित धारणा है):

 if request.method == 'POST': bannedphraseform = BannedPhraseForm(request.POST, prefix='banned') if bannedphraseform.is_valid(): bannedphraseform.save() else: bannedphraseform = BannedPhraseForm(prefix='banned') if request.method == 'POST' and not bannedphraseform.is_valid(): expectedphraseform = ExpectedPhraseForm(request.POST, prefix='expected') bannedphraseform = BannedPhraseForm(prefix='banned') if expectedphraseform.is_valid(): expectedphraseform.save() else: expectedphraseform = ExpectedPhraseForm(prefix='expected') 

Django के क्लास आधारित विचार एक सामान्य फॉर्मवी्यू प्रदान करते हैं, लेकिन सभी उद्देश्यों और प्रयोजनों के लिए यह केवल एक रूप को संभाल करने के लिए डिज़ाइन किया गया है।

Django के सामान्य विचारों का उपयोग करते हुए एक ही लक्ष्य क्रिया url के साथ कई रूपों को संभाल करने का एक तरीका 'TemplateView' का विस्तार करना है जैसा कि नीचे दिखाया गया है; मैं अक्सर इस दृष्टिकोण का उपयोग करता हूं कि मैंने इसे एक ग्रहण आईडीई टेम्पलेट में बनाया है।

 class NegotiationGroupMultifacetedView(TemplateView): ### TemplateResponseMixin template_name = 'offers/offer_detail.html' ### ContextMixin def get_context_data(self, **kwargs): """ Adds extra content to our template """ context = super(NegotiationGroupDetailView, self).get_context_data(**kwargs) ... context['negotiation_bid_form'] = NegotiationBidForm( prefix='NegotiationBidForm', ... # Multiple 'submit' button paths should be handled in form's .save()/clean() data = self.request.POST if bool(set(['NegotiationBidForm-submit-counter-bid', 'NegotiationBidForm-submit-approve-bid', 'NegotiationBidForm-submit-decline-further-bids']).intersection( self.request.POST)) else None, ) context['offer_attachment_form'] = NegotiationAttachmentForm( prefix='NegotiationAttachment', ... data = self.request.POST if 'NegotiationAttachment-submit' in self.request.POST else None, files = self.request.FILES if 'NegotiationAttachment-submit' in self.request.POST else None ) context['offer_contact_form'] = NegotiationContactForm() return context ### NegotiationGroupDetailView def post(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) if context['negotiation_bid_form'].is_valid(): instance = context['negotiation_bid_form'].save() messages.success(request, 'Your offer bid #{0} has been submitted.'.format(instance.pk)) elif context['offer_attachment_form'].is_valid(): instance = context['offer_attachment_form'].save() messages.success(request, 'Your offer attachment #{0} has been submitted.'.format(instance.pk)) # advise of any errors else messages.error('Error(s) encountered during form processing, please review below and re-submit') return self.render_to_response(context) 

HTML टेम्पलेट निम्न प्रभाव के लिए है:

 ... <form id='offer_negotiation_form' class="content-form" action='./' enctype="multipart/form-data" method="post" accept-charset="utf-8"> {% csrf_token %} {{ negotiation_bid_form.as_p }} ... <input type="submit" name="{{ negotiation_bid_form.prefix }}-submit-counter-bid" title="Submit a counter bid" value="Counter Bid" /> </form> ... <form id='offer-attachment-form' class="content-form" action='./' enctype="multipart/form-data" method="post" accept-charset="utf-8"> {% csrf_token %} {{ offer_attachment_form.as_p }} <input name="{{ offer_attachment_form.prefix }}-submit" type="submit" value="Submit" /> </form> ... 

मुझे एक ही पृष्ठ पर स्वतंत्र रूप से मान्य कई रूपों की आवश्यकता है कुंजी अवधारणाओं को मैं याद कर रहा था 1) सबमिट बटन नाम के लिए फ़ॉर्म उपसर्ग का उपयोग करना और 2) एक असीम फ़ॉर्म सत्यापन को ट्रिगर नहीं करता है। अगर यह किसी और के लिए मदद करता है, तो इसका जवाब मेरे एडम्स-नेलसन और @ डैनियल-सोकोलोव्स्की द्वारा दिए गए उत्तरों के आधार पर TemplateView का उपयोग करते हुए एफ़ॉर्म और BForm के दो रूपों का सरलीकृत उदाहरण है और @ एज़ेईएन द्वारा टिप्पणी ( https://stackoverflow.com/a/17303480 / 268034 9):

 # views.py def _get_form(request, formcls, prefix): data = request.POST if prefix in request.POST else None return formcls(data, prefix=prefix) class MyView(TemplateView): template_name = 'mytemplate.html' def get(self, request, *args, **kwargs): return self.render_to_response({'aform': AForm(prefix='aform_pre'), 'bform': BForm(prefix='bform_pre')}) def post(self, request, *args, **kwargs): aform = _get_form(request, AForm, 'aform_pre') bform = _get_form(request, BForm, 'bform_pre') if aform.is_bound and aform.is_valid(): # Process aform and render response elif bform.is_bound and bform.is_valid(): # Process bform and render response return self.render_to_response({'aform': aform, 'bform': bform}) # mytemplate.html <form action="" method="post"> {% csrf_token %} {{ aform.as_p }} <input type="submit" name="{{aform.prefix}}" value="Submit" /> {{ bform.as_p }} <input type="submit" name="{{bform.prefix}}" value="Submit" /> </form> 

यह थोड़ा देर हो चुकी है, लेकिन यह मैंने पाया सबसे अच्छा उपाय है आप प्रपत्र के नाम और वर्ग के लिए एक नज़र-अप शब्दकोश बनाते हैं, आपको फ़ॉर्म की पहचान करने के लिए एक विशेषता भी जोड़नी होगी, और अपने विचारों में आपको इसे form.formlabel साथ एक छिपे हुए क्षेत्र के रूप में जोड़ना होगा।

 # form holder form_holder = { 'majeur': { 'class': FormClass1, }, 'majsoft': { 'class': FormClass2, }, 'tiers1': { 'class': FormClass3, }, 'tiers2': { 'class': FormClass4, }, 'tiers3': { 'class': FormClass5, }, 'tiers4': { 'class': FormClass6, }, } for key in form_holder.keys(): # If the key is the same as the formlabel, we should use the posted data if request.POST.get('formlabel', None) == key: # Get the form and initate it with the sent data form = form_holder.get(key).get('class')( data=request.POST ) # Validate the form if form.is_valid(): # Correct data entries messages.info(request, _(u"Configuration validée.")) if form.save(): # Save succeeded messages.success( request, _(u"Données enregistrées avec succès.") ) else: # Save failed messages.warning( request, _(u"Un problème est survenu pendant l'enregistrement " u"des données, merci de réessayer plus tard.") ) else: # Form is not valid, show feedback to the user messages.error( request, _(u"Merci de corriger les erreurs suivantes.") ) else: # Just initiate the form without data form = form_holder.get(key).get('class')(key)() # Add the attribute for the name setattr(form, 'formlabel', key) # Append it to the tempalte variable that will hold all the forms forms.append(form) 

मुझे उम्मीद है कि यह भविष्य में मदद करेगा

उपर्युक्त को संभालने का एक आसान तरीका है

एचटीएमएल टेम्पलेट में हम पोस्ट डालते हैं

 <form action="/useradd/addnewroute/" method="post" id="login-form">{% csrf_token %} <!-- add details of form here--> <form> <form action="/useradd/addarea/" method="post" id="login-form">{% csrf_token %} <!-- add details of form here--> <form> 

दृश्य में

  def addnewroute(request): if request.method == "POST": # do something def addarea(request): if request.method == "POST": # do something 

URL में आवश्यक जानकारी दें जैसे

 urlpatterns = patterns('', url(r'^addnewroute/$', views.addnewroute, name='addnewroute'), url(r'^addarea/', include('usermodules.urls')), 

यदि आप क्लास-आधारित विचारों और विभिन्न 'एक्शन' एटर्स के साथ दृष्टिकोण का उपयोग कर रहे हैं तो मेरा मतलब है

दो रूपों के लिए कार्रवाई में अलग यूआरएल रखें। फिर दो अलग-अलग रूपों से निपटने के लिए आपके पास दो भिन्न दृश्य फ़ंक्शन होंगे।

आप अतिभारित get_context_data विधि का उपयोग करके विभिन्न रूपों से त्रुटियों को आसानी से संभाल सकते हैं, पूर्व:

views.py:

 class LoginView(FormView): form_class = AuthFormEdited success_url = '/' template_name = 'main/index.html' def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) .... def get_context_data(self, **kwargs): context = super(LoginView, self).get_context_data(**kwargs) context['login_view_in_action'] = True return context class SignInView(FormView): form_class = SignInForm success_url = '/' template_name = 'main/index.html' def dispatch(self, request, *args, **kwargs): return super(SignInView, self).dispatch(request, *args, **kwargs) ..... def get_context_data(self, **kwargs): context = super(SignInView, self).get_context_data(**kwargs) context['login_view_in_action'] = False return context 

टेम्पलेट:

 <div class="login-form"> <form action="/login/" method="post" role="form"> {% csrf_token %} {% if login_view_in_action %} {% for e in form.non_field_errors %} <div class="alert alert-danger alert-dismissable"> {{ e }} <a class="panel-close close" data-dismiss="alert">×</a> </div> {% endfor %} {% endif %} ..... </form> </div> <div class="signin-form"> <form action="/registration/" method="post" role="form"> {% csrf_token %} {% if not login_view_in_action %} {% for e in form.non_field_errors %} <div class="alert alert-danger alert-dismissable"> {{ e }} <a class="panel-close close" data-dismiss="alert">×</a> </div> {% endfor %} {% endif %} .... </form> </div> 

अपने समाधान को साझा करना चाहता था जहां जिंजो प्रपत्र का उपयोग नहीं किया जा रहा है मेरे पास एक पृष्ठ पर कई फार्म तत्व हैं और सभी फॉर्मों से सभी POST अनुरोधों को प्रबंधित करने के लिए मैं एक एकल दृश्य का उपयोग करना चाहता हूं।

मैंने जो किया है, मैंने एक अदृश्य इनपुट टैग पेश किया है, ताकि मैं यह जांचने के लिए एक पैरामीटर पारित कर सकूं कि किस फॉर्म को सबमिट किया गया है।

 <form method="post" id="formOne"> {% csrf_token %} <input type="hidden" name="form_type" value="formOne"> ..... </form> ..... <form method="post" id="formTwo"> {% csrf_token %} <input type="hidden" name="form_type" value="formTwo"> .... </form> 

views.py

 def handlemultipleforms(request, template="handle/multiple_forms.html"): """ Handle Multiple <form></form> elements """ if request.method == 'POST': if request.POST.get("form_type") == 'formOne': #Handle Elements from first Form elif request.POST.get("form_type") == 'formTwo': #Handle Elements from second Form