initial =不处理表单输入

Dan*_*iel 2 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())
Run Code Online (Sandbox Code Playgroud)

我的(简化)视图是这样的:

def search(request):
    search_form = SearchForm(request.GET)        
    return render(request, "search.html", {'search_form': search_form})
Run Code Online (Sandbox Code Playgroud)

我的目标是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" />
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Dan*_*iel 6

代码不起作用的原因是因为

search_form = SearchForm(request.GET)
Run Code Online (Sandbox Code Playgroud)

创建绑定表单.绑定表单没有初始值.

我最终得到了这个宝石.它检查是否request.GET包含至少一个表单的字段(例如,无论值如何/?page=),然后创建一个可以进行验证的绑定表单.否则,用户访问/或提交了与表格无关的其他参数(例如/?foo=bar).

if request.GET & SearchForm.base_fields.keys():
    search_form = SearchForm(request.GET)
else:
    ...
    search_form = SearchForm(initial={...})
Run Code Online (Sandbox Code Playgroud)