验证后更改django表单字段的值

时间:2011-12-20 05:16:18

标签: django django-forms faceted-search

我正在开发一个分面搜索系统。在搜索框下方,有一个无线电选择小部件,其中包含以下选项:

O New search     O Within your results

加载页面时,默认情况下应选择新搜索,因此我使用initial关键字。

我遇到的问题是,在用户选择New search并发出查询后,我希望将默认设置切换为Within your results,因为大多数搜索都是优化。

所以我需要做的是更改用户提交的值,该值存储在Django Form中。

如何更改表单字段的值?验证已经发生,从我到目前为止收集的内容来看,request.GET是不可变的(可能是一件好事),我也无法更改Form

3 个答案:

答案 0 :(得分:0)

django推荐的修改request.GET的方法是call the copy method.

mutable_get = request.GET.copy()
mutable_get['search'] = 'within_results'

您还可以使用__init__形式动态设置初始值,或者只访问绑定的表单字段属性。

form.fields['my_field'].initial = True

哪一项起作用取决于你如何构建表格。

答案 1 :(得分:0)

class MyForm(forms.Form):
    def __init__(self, data, *args, **kwargs):
        if 'do_search' in data: # or any other way to find out if there is an existing search
            kwargs['initial'] = kwargs.setdefault('initial', {'your_radio': 'your_within_value'})
        super(MyForm, self).__init__(self, data, *args, **kwargs)

答案 2 :(得分:0)

只是一个想法,而不是黑客用户输入,只有当你有搜索的查询参数时才能显示该字段。

这种方式,用户第一次“点击”视图时,他看不到无用的无线电场。

e.g。在这里我将在表单的__init__期间使用搜索参数将字段设置为隐藏且具有正确的初始值(您还可以执行类似DrTysa建议的操作并在表单级别移动搜索检测查看数据字典)

searching = False
if data.get('query'):
    searching = True
form = SearchForm(data, searching=searching)