initial =不处理表单输入

时间:2017-03-29 10:38:58

标签: django django-forms

我的页面/上有一个简单的搜索表单。

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" />

有什么想法吗?

2 个答案:

答案 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'
})