2009-05-14 18 views
119

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

<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',) 

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

उत्तर

70

आप सत्यापन से पहले POST डेटा तक पहुंचने के लिए clean_email विधि में self.data का उपयोग कर सकते हैं। इसमें बटन को दबाए जाने के आधार पर 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

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

+7

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

+4

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

189

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

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

क्या अनुरोध clean_xxx सत्यापन विधियों के अंदर उपलब्ध है? – sureshvv

8

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

<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... 
+0

form1.as_p इसका उपयोग कब करें ?? विचारों में, फॉर्म की वैधता की जांच करते समय, मेरी इच्छा है कि मैं कर सकता हूं ... form1.is_valid() फिर यह करें, form2.is_valid() यह करें .. – tilaprimera

3

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

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

आप MultiRedirectMixin कहां और कैसे उपयोग करेंगे? कृपया एक उदाहरण के साथ विस्तृत करें। –

0

एक यूआरएल! ऐसा ही!

###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> 
संबंधित मुद्दे