我的页面/
上有一个简单的搜索表单。
class SearchForm(Form):
query = CharField(max_length=256,
label="Search",
required=False,
widget=TextInput(attrs={'placeholder': 'Search …',
'class': 'form-control'}))
page = IntegerField(min_value=8, initial=1, widget=HiddenInput())
sort = CharField(max_length=16, initial="id", widget=HiddenInput())
order = CharField(max_length=4, initial="asc", widget=HiddenInput())
我的(简化)视图是这样的:
def search(request):
search_form = SearchForm(request.GET)
return render(request, "search.html", {'search_form': search_form})
我的目标是让search_form.cleaned_data['<FIELD>']
返回我在课程SearchForm
中设置的初始值,而不必检查它们是否存在None
或为空''
。
不幸的是我的代码不起作用,因为输入元素是这样呈现的:
<input id="id_page" name="page" type="hidden" />
<input id="id_sort" maxlength="16" name="sort" type="hidden" />
<input id="id_order" maxlength="4" name="order" type="hidden" />
有什么想法吗?
答案 0 :(得分:5)
代码不起作用的原因是因为
search_form = SearchForm(request.GET)
创建绑定表单。绑定表单没有初始值。
我最终得到了这个宝石。它检查request.GET
是否至少包含一个表单的字段(无论值是什么,例如/?page=
),然后创建一个可以进行验证的绑定表单。否则,用户访问了/
或提交了与表单无关的其他参数(例如/?foo=bar
)。
if request.GET & SearchForm.base_fields.keys():
search_form = SearchForm(request.GET)
else:
...
search_form = SearchForm(initial={...})
答案 1 :(得分:-1)
在实例化表单以获取值时,需要指定初始参数。使用form in initial声明仅适用于未绑定的表单。 尝试:
search_form = SearchForm(request.GET, initial={
'page': 1,
'sort': 'id',
'order': 'asc'
})