मैं कई सबमिट बटन django फॉर्म कैसे बना सकता हूं?


156

मेरे पास ईमेल के लिए एक इनपुट है और न्यूज़लेटर की सदस्यता लेने और सदस्यता लेने के लिए दो सबमिट बटन हैं:

<form action="" method="post">
{{ form_newsletter }}
<input type="submit" name="newsletter_sub" value="Subscribe" />
<input type="submit" name="newsletter_unsub" value="Unsubscribe" />
</form>

मेरा भी क्लास फॉर्म है:

class NewsletterForm(forms.ModelForm):
    class Meta:
        model = Newsletter
        fields = ('email',)

मुझे अपनी स्वयं की clean_email विधि लिखनी होगी और मुझे यह जानना होगा कि कौन सा बटन सबमिट किया गया था। लेकिन सबमिट बटन का मूल्य self.cleaned_dataशब्दकोश में नहीं है । क्या मुझे बटन के मूल्य मिल सकते हैं अन्यथा?

जवाबों:


97

आप सत्यापन से पहले POST डेटा तक पहुंचने के self.dataलिए clean_emailविधि का उपयोग कर सकते हैं । इसमें एक कुंजी होनी चाहिए जिसे कहा जाता है newsletter_subया newsletter_unsubनिर्भर करता है कि कौन सा बटन दबाया गया था।

# in the context of a django.forms form

def clean(self):
    if 'newsletter_sub' in self.data:
        # do subscribe
    elif 'newsletter_unsub' in self.data:
        # do unsubscribe

4
क्या आप एक एनोटेट उदाहरण दे सकते हैं? यह वास्तव में मदद करेगा
झारखंड

9
मुझे नहीं लगता कि cleanमॉडल-स्तरीय तर्क करने के लिए वास्तव में सही तरह की जगह नहीं है। यह विशेष रूप से एक फॉर्म को साफ करने और किसी भी ValidationErrorएस को खोजने के लिए है जो कई इनपुटों को फैलाता है। स्वेन का जवाब सही दिशा में अधिक है, लेकिन अभी भी जरूरी नहीं कि सबसे अच्छा जवाब
पैट्रिक

8
सुरक्षा जोखिम! फॉर्म को वैध होने से पहले डेटाबेस में परिवर्तन करने के लिए फॉर्म डेटा का उपयोग करना खतरनाक है।
क्वांट मेट्रोपोलिस

1
आप भिन्न प्रकार के सत्यापन चलाना चाहते हैं, जिसके आधार पर बटन दबाया गया था। उस स्थिति में, कोई "सुरक्षा" प्रभाव नहीं है।
सुरेशव

230

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

if 'newsletter_sub' in request.POST:
    # do subscribe
elif 'newsletter_unsub' in request.POST:
    # do unsubscribe

1
अनुरोध क्लीन_xxx सत्यापन विधियों के अंदर उपलब्ध है?
सुरेशव

यह किस विधि में जाना चाहिए?
जॉन मैकक्लब ने

1
@JonMcClung इनसाइड def post(self, request, *args, **kwargs)
ए। कलि

23

आप भी ऐसा कर सकते हैं,

 <form method='POST'>
    {{form1.as_p}}
    <button type="submit" name="btnform1">Save Changes</button>
    </form>
    <form method='POST'>
    {{form2.as_p}}
    <button type="submit" name="btnform2">Save Changes</button>
    </form>

कोड

if request.method=='POST' and 'btnform1' in request.POST:
    do something...
if request.method=='POST' and 'btnform2' in request.POST:
    do something...

form1.as_p इस का उपयोग करने के लिए कब ?? प्रपत्रों की वैधता की जाँच करते समय, मैं चाहता हूँ कि मैं कर सकता हूँ ... form1.is_valid () तब ऐसा करें, form2.is_valid () ऐसा करें ..
tilaprimera

5

यह अब एक पुराना प्रश्न है, फिर भी मेरे पास एक ही मुद्दा था और एक समाधान मिला जो मेरे लिए काम करता है: मैंने मल्टीरेडायरेक्टमिक्सिन लिखा।

from django.http import HttpResponseRedirect

class MultiRedirectMixin(object):
    """
    A mixin that supports submit-specific success redirection.
     Either specify one success_url, or provide dict with names of 
     submit actions given in template as keys
     Example: 
       In template:
         <input type="submit" name="create_new" value="Create"/>
         <input type="submit" name="delete" value="Delete"/>
       View:
         MyMultiSubmitView(MultiRedirectMixin, forms.FormView):
             success_urls = {"create_new": reverse_lazy('create'),
                               "delete": reverse_lazy('delete')}
    """
    success_urls = {}  

    def form_valid(self, form):
        """ Form is valid: Pick the url and redirect.
        """

        for name in self.success_urls:
            if name in form.data:
                self.success_url = self.success_urls[name]
                break

        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        """
        Returns the supplied success URL.
        """
        if self.success_url:
            # Forcing possible reverse_lazy evaluation
            url = force_text(self.success_url)
        else:
            raise ImproperlyConfigured(
                _("No URL to redirect to. Provide a success_url."))
        return url

आप कहाँ और कैसे बिल्कुल MultiRedirectMixin का उपयोग करेंगे? कृपया एक उदाहरण के साथ विस्तृत करें।
सौरव कुमार

4

एक ही दृश्य के लिए एक यूआरएल! इस तरह!

urls.py

url(r'^$', views.landing.as_view(), name = 'landing'),

views.py

class landing(View):
        template_name = '/home.html'
        form_class1 = forms.pynamehere1
        form_class2 = forms.pynamehere2
            def get(self, request):
                form1 = self.form_class1(None)
                form2 = self.form_class2(None)
                return render(request, self.template_name, { 'register':form1, 'login':form2,})

             def post(self, request):
                 if request.method=='POST' and 'htmlsubmitbutton1' in request.POST:
                        ## do what ever you want to do for first function ####
                 if request.method=='POST' and 'htmlsubmitbutton2' in request.POST:
                         ## do what ever you want to do for second function ####
                        ## return def post###  
                 return render(request, self.template_name, {'form':form,})
/home.html
    <!-- #### form 1 #### -->
    <form action="" method="POST" >
      {% csrf_token %}
      {{ register.as_p }}
    <button type="submit" name="htmlsubmitbutton1">Login</button>
    </form>
    <!--#### form 2 #### -->
    <form action="" method="POST" >
      {% csrf_token %}
      {{ login.as_p }}
    <button type="submit" name="htmlsubmitbutton2">Login</button>
    </form>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.