我有一个简单的时事通讯签名表格,我想把它包含在网站的每个页面上。
这是表格(订阅者/表格.py(
from django import forms
class SubscriberForm(forms.Form):
email = forms.EmailField()
first_name = forms.CharField(max_length=20)
last_name = forms.CharField(max_length=30)
我已经设置了一个上下文处理器,所以我可以在基本模板中呈现表单,例如
def subscriber_form(request):
return {
'subscriber_form':SubscriberForm(),
}
在我的基本模板中
{% include "subscribers/index.html" with form=subscriber_form %}
都很好。
但是,问题是如何在不将用户带到其他 URL(和视图(的情况下验证表单。我显然不想将用户带到(例如(/subscriber/index(因此操作将是"订阅者/索引"(和我验证表单的关联视图,因为我希望验证错误(如果有(显示在(基本(模板上。我还希望成功消息显示在基本模板上,而不是将用户带到"成功"网址。使用 JavaScript 进行验证也不是问题,但我希望在 JS 被禁用的情况下进行回退。
这都是因为我希望表单显示在每个页面上 - 因此我需要将其包含在基本模板中。
在 在每个页面上放置一个 django 登录表单的帮助下,我通过编写一个中间件类来解决它:
from subscribers.forms import SubscriberForm
class SubscriberFormMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
if request.method == 'POST':
form = SubscriberForm(request.POST, prefix='subscriber')
if form.is_valid():
// do your thing
request.method = 'GET'
else:
form = SubscriberForm(prefix='subscriber')
request.subscriber_form = form
然后在基本模板中
{% include "subscribers/index.html" with form=request.subscriber_form %}
表单中的操作设置为".",因此我可以在任何页面上使用它。