我怎样才能build立多个提交buttonDjango的forms?

我有一个电子邮件input和两个提交button来订阅和取消订阅通讯:

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

我也有class级forms:

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

我必须写我自己的clean_email方法,我需要知道button是哪个button被submited。 但是提交button的值不在self.cleaned_data字典中。 我可以得到其他button的值吗?

您可以在clean_email方法中使用self.data在validation之前访问POST数据。 它应该包含一个名为newsletter_subnewsletter_unsub的键,具体取决于按下哪个button。

 # 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 

例如:

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

你也可以这样做,

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

这是一个古老的问题,但我遇到了同样的问题,并find了适合我的解决scheme:我写了MultiRedirectMixin。

 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 

一个url相同的看法! 像这样!

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