首页 > 解决方案 > 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 被禁用的情况下进行后备。

这都是因为我希望表单显示在每个页面上 - 因此我需要将它包含在基本模板中。

标签: djangodjango-forms

解决方案


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 %}

表单中的操作设置为“。” 所以我可以在任何页面上使用它。


推荐阅读