Django 验证作为基本模板一部分包含的(时事通讯)表单



我有一个简单的时事通讯签名表格,我想把它包含在网站的每个页面上。

这是表格(订阅者/表格.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 %}

表单中的操作设置为".",因此我可以在任何页面上使用它。

最新更新