我正在尝试在用于检索ListView视图中的对象列表的Django表单上运行验证。尽管在这里阅读了django文档和许多其他问题,但我无法在此简单的测试代码中找出问题所在:
form.html
<form action="list.html" method="get">
{{ form }}
<input type="submit" value="Submit">
</form>
list.html
<ul>
{% for area in object_list %}
<li>{{ area.name }}</li>
{% endfor %}
</ul>
forms.py
from django import forms
class SearchArea(forms.Form):
area = forms.CharField(label='Area code', max_length=6)
def clean_area(self):
area = self.cleaned_data['area'].upper()
if '2' in area:
raise forms.ValidationError("Error!")
return area
views.py
class HomePageView(FormView):
template_name = 'form.html'
form_class = SearchArea
class AreaListView(ListView):
template_name = 'list.html'
model = AreaCentral
def get_queryset(self):
q = self.request.GET.get('area')
return AreaCentral.objects.filter(area__istartswith=q)
当我尝试提交类似“ 2e”的内容时,我会期望验证错误,而是提交了表单。此外,我在GET参数中看到“ area”甚至没有转换为大写字母(“ 2E”而不是“ 2e”)。
答案 0 :(得分:0)
默认情况下,FormView仅在POST上处理表单; GET用于最初显示空白表格。因此,您需要在模板表单元素中使用method="post"
。
您的action
属性也是可疑的;它需要指向表单视图的URL。如果实际上是URL,请注意,在Django URL中通常不使用扩展名,例如“ .html”,我建议不要这样做。