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