Django

2011-05-02 8 views
7

में किसी पृष्ठ पर एकाधिक रूपों का उपयोग करके मैं Django में प्रति पृष्ठ एक से अधिक रूपों का उपयोग कैसे करूं?Django

+1

कृपया अधिक जानकारी प्रदान करें, अन्यथा हम आपकी सहायता नहीं कर सकते हैं। –

+1

मुझे लगता है कि आप एक क्रिया है। – musiKk

+1

संभावित डुप्लिकेट [Django में एक पृष्ठ पर एकाधिक रूपों को संभालने के लिए उचित तरीका] (http://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple-forms-on-one-page-in- django) – Anto

उत्तर

13

कृपया निम्नलिखित पहले से पूछा (और जवाब) प्रश्न देखें:

Django: multiple models in one template using forms

और

Proper way to handle multiple forms on one page in Django

if request.POST(): 
    a_valid = formA.is_valid() 
    b_valid = formB.is_valid() 
    c_valid = formC.is_valid() 
    # we do this since 'and' short circuits and we want to check to whole page for form errors 
    if a_valid and b_valid and c_valid: 
     a = formA.save() 
     b = formB.save(commit=False) 
     c = formC.save(commit=False) 
     b.foreignkeytoA = a 
     b.save() 
     c.foreignkeytoB = b 
     c.save() 
3

आपके प्रश्नों की तारीख मैं तुम्हें वर्ग का उपयोग कर रहे ग्रहण करने के लिए जा रहा हूँ से आंकना:

आप वास्तव में क्या कह रहे हैं, यह एक ही पृष्ठ पर विभिन्न मॉडलों को संभालने के लिए मेरी पसंदीदा तरीका है पर निर्भर करता है

आधारित विचारों, नीचे मेरे अन्य जवाब यहाँ से कॉपी किया जाता है: Proper way to handle multiple forms on one page in Django

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) 

एचटीएमएल टेम्पलेट निम्नलिखित प्रभाव के लिए है:

... 

<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> 

... 
+0

यह: 'data = self.request.POST अगर' negotiationAttachment-submit 'self.request.POST में कोई नहीं' !!!! – zeraien

+0

@zeraien? - क्या आप –

+1

को स्पष्टीकरण दे सकते हैं जब एक ही पृष्ठ पर एकाधिक रूप होते हैं, सबमिट बटन पर एक कुंजी/मान जोड़ना मुझे दृश्य प्रसंस्करण कोड में विभिन्न रूपों को अलग करने की अनुमति देता था। तो मेरे मामले में मैंने एक छोटी सी विधि बनाई जिसे मैं प्रत्येक फॉर्म के लिए बुलाता हूं ... 'def _get_post (अनुरोध, उपसर्ग): वापसी अनुरोध। POST अगर अनुरोध में '% s-submit'% उपसर्ग है। अन्य कोई नहीं और प्रत्येक प्रपत्र सिर्फ POST डेटा प्राप्त करने के लिए कहता है: 'password_form = पासवर्डChangeForm (उपयोगकर्ता = request.user, डेटा = _get_post (अनुरोध, 'पासवर्ड'), उपसर्ग = 'पासवर्ड')' उस पंक्ति ने मुझे प्रेरणा दी ऐसा करने के लिए ;-) – zeraien