【问题标题】:django context processor form not showing errors when submittingdjango上下文处理器表单在提交时不显示错误
【发布时间】:2017-12-14 15:44:22
【问题描述】:

我正在使用 上下文处理器 将表单呈现到我的项目中的基本模板,并且表单似乎工作正常,除了它没有显示必填字段为空白等的任何错误。页面即使没有填写字段,也只是重新加载。

我之前在其他项目中使用过这种方法,效果很好,但现在我无法弄清楚发生了什么以及为什么会这样。

这是我的 forms.py

from django import forms

class VersionSelectorForm(forms.Form):
    mode = forms.ChoiceField(widget=forms.RadioSelect(),
                             choices=(('live', 'Live'), ('history', 'History')),
                             initial='live',
                             required=True,
                             help_text='Required')
    date = forms.DateField(widget=forms.TextInput(attrs={'class': 'datepicker'}),
                           required=True,
                           help_text='required')

    def clean(self):
        cleaned_data = super(VersionSelectorForm, self).clean()
        mode = cleaned_data.get('mode')
        date = cleaned_data.get('date')

        if mode == 'history' and not date:
            msg = 'Date should be picked if \'History\' mode selected'
            self.add_error('date', msg)

view.py

from django.shortcuts import redirect
from .forms import VersionSelectorForm

def select_version(request): 
    if request.method == "POST": 
        form = VersionSelectorForm(request.POST) 
        if form.is_valid():
            print('I am valid')
            mode = form.cleaned_data["mode"]
            date = form.cleaned_data["date"]
            if mode == "History":
                request.session['selected_date'] = date
            else:
                request.session['selected_date'] = None
    else: 
        form = VersionSelectorForm() 
    return redirect(request.META['HTTP_REFERER']) 

context_processors.py

from .forms import VersionSelectorForm 

def VersionSelectorFormGlobal(request): 
    return {'version_selector_form': VersionSelectorForm()} 

urls.py:

from django.contrib import admin
from diagspecgen import views

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^select_version/$', views.select_version, name='select_version'),
]

来自base.html的sn-p

<section><div>
            <form method="post" action="{% url 'select_version'%}">
                {% csrf_token %}
                {{ version_selector_form.as_p }}
                <button type="submit">Submit</button>
            </form>
        </div></section>

当然,我已经在 settings.pycontext_processors 列表中添加了'diagspecgen.context_processors.VersionSelectorFormGlobal'

期待任何帮助,并在此先感谢您。

【问题讨论】:

  • 它总是重定向,因为在你看来,这就是你所做的:你总是重定向,无论表单是否有效。
  • @DanielRoseman 感谢您的回复 Deniel。请你对这个案子做更多解释。原因,我问的原因是这种方法确实适用于另一个项目,唯一的区别是表单是直接从 Meta 类表单中的模型构建的。现在发生了一些奇怪的事情。
  • 没什么好解释的。您在视图的末尾有一个重定向,并且在其他任何地方都没有其他返回,因此始终调用重定向。这与模型或 Meta 无关。
  • @DanielRoseman 好的,但是为什么当表单字段为空白时不显示这些动态消息,据我所知和理解,应该出现验证消息并且至少在“novalidate”参数出现之前不会重新加载页面传递给“表单”标签。
  • 但消息只有在你渲染一个包含它们的模板时才会出现。而你不是,因为再一次你总是在重定向

标签: python django forms


【解决方案1】:

您不应该使用上下文处理器来呈现您的表单,而是将其传递给 django 快捷方式 render 函数。

你可以这样做:

def select_version(request): 
    if request.method == "POST": 
        form = VersionSelectorForm(request.POST) 
        if form.is_valid():
            print('I am valid')
            mode = form.cleaned_data["mode"]
            date = form.cleaned_data["date"]
            if mode == "History":
                request.session['selected_date'] = date
            else:
                request.session['selected_date'] = None
    else: 
        form = VersionSelectorForm() 
    return render(request, 'template.html', {'form': form}) 

别忘了导入from django.shortcuts import render

文档链接:https://docs.djangoproject.com/en/2.0/topics/forms/#the-view

【讨论】:

  • 不幸的是,这不起作用,我正在尝试将表单渲染到基本模板,从中将扩展更多模板,因此此处不适合渲染。最奇怪的工作人员是完全相同的代码在其他项目中运行良好,唯一的区别是这里的表单与模型无关。
  • 好吧,恕我直言,如果你想显示表单,你需要渲染它;)
  • 正如@DanielRoseman 在他的 cmets 中所说,如果您总是重定向,则无法在页面上显示错误。
猜你喜欢
  • 2014-03-13
  • 2015-10-17
  • 2015-11-10
  • 1970-01-01
  • 2013-10-28
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多