如何构建多个提交按钮 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',)

我必须编写自己的 clean _ email 方法,并且我需要知道表单是由哪个按钮提交的。但是提交按钮的值不在 self.cleaned_data字典中。 否则我能得到按钮的值吗?

156171 次浏览

在验证之前,可以在 clean_email方法中使用 self.data来访问 POST 数据。它应该包含一个称为 newsletter_subnewsletter_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

例如:

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

这是一个老问题了,不过我也遇到了同样的问题,并且找到了一个适合我的解决方案: 我编写了 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

一个网址到同一个视图! 像这样!

Urls.py

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

视野,视野

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>

我知道这有些陈旧,但至少可以说,有些答案是简短的,而且它们没有解决表单不是 django 表单的常见问题。

这个解决方案的灵感来自 这篇博文。它依赖于使用从 django.views.generic.edit 派生的视图类。FormMixin,例如 CreateView、 UpdateView 或 DeleteView。这些提供了在 请求中公开按钮名称的 获得成功方法

Html

<html>
<body>
<form method="post">
<div>
<label> <input type="radio" name="select-type" value="A">Type A</label>
</div>
<div>
<label> <input type="radio" name="select-type" value="B">Type B</label>
</div>
<div>
<input type="submit" value="Use selected">
</div>
<div>
<input type="submit" name="no-selection" value="None of the above">
</div>
</form>
</body>
</html>

视野,视野

from django.views.generic import UpdateView


class GetType(UpdateView):
def get(self, request):
return render(request, 'get_type.html', {})


def post(self, request):
button = self.get_success_url()
print(button)


def get_success_url(self):
if 'no-selection' in self.request.POST:
return 'none selected'
return ''