django - Django 验证包含在基本模板中的(通讯)表单
问题描述
我有一个简单的时事通讯签名表格,我想将其包含在网站的每个页面上。
这是表格(订阅者/forms.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(因此操作将是“'subscriber/index”)和我验证表单的关联视图,因为我想要验证错误(如果有的话) 显示在(基础)模板上。我还希望在基本模板上显示成功消息,而不是将用户带到“成功”网址。使用 JavaScript 进行验证也不是问题,但我想在 JS 被禁用的情况下进行后备。
这都是因为我希望表单显示在每个页面上 - 因此我需要将它包含在基本模板中。
解决方案
在Putting a django login form on each page的帮助下,我通过编写中间件类解决了这个问题:
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 %}
表单中的操作设置为“。” 所以我可以在任何页面上使用它。
推荐阅读
- apache-spark - 在临时视图上链接 spark sql 查询?
- prometheus - 在 grafana 中添加具有不同标签和值的自定义字段
- angular - 将 Angular 4 升级到 Angular 8 后的问题
- android - 使用桌面版 Play 市场版本播放安装引荐来源网址跟踪
- c# - 使用 Activator.CreateInstance() 创建对象的人口列表问题
- angular - 如何将 RatingComponent 的值设置为零?
- javascript - 基于 electron-vue 的 Electron 应用中 Vuex 突变的奇怪行为
- database - 当什么都没有时,查询不会返回预定义的值
- ios - 如何使用`use_frameworks!` 到特定的cocoapods pod?
- regex - 谷歌表格中的数据交集是或否:在定义的字符串中查找任何列表项(这也是数组公式的结果)