干草堆的设置字段的初始值FacetedSearchForm
问题描述:
我在其中一个项目中使用django-haystack
和Solr
后端。我有一个从FacetedSearchForm
继承的SearchForm。现在,我正在尝试的是为表单中的某些字段添加一个intital值。干草堆的设置字段的初始值FacetedSearchForm
from django.forms import forms
from haystack.forms import FacetedSearchForm
MySearchForm(FacetedSearchForm):
""" My basic search form
"""
field_one = forms.CharField(required=False, initial='0')
field_two = forms.CharField(required=False, initial='some_value')
以前当我使用django.forms.Form
这个用来工作绝对没问题。我一直在挖掘django代码和干草堆代码,并且喜欢FacetedSearchForm
扩展haystack.forms.SearchForm
,它扩展了django.forms.Forms
。所以我不明白为什么这不应该工作。
参考文献:
我也试着重写__init__
方法,我想我会设置初始值有:
def __init__(self, *args. **kwargs):
data = kwargs.pop('data', None)
if data:
values = {
'field_one': (data.get('field_one', None), '0'),
'field_two': (data.get('field_two', None), 'some_value')
}
for value in values:
if not values[value][0]:
self.fields[value].initial = values[value][3]
super(MySearchForm, self).__init__(*args, **kwargs)
但在FacetedSearchForm
没有fields
属性,虽然它们提供了接入base_fields
对象,所以我不是想这样做:
self.base_fields[value].initial = values[value][4]
这也不起作用。
奇怪的部分来了,当我意识到它不会引发任何错误或异常,所以我试着打印出初始值进行调试,以及它确实显示初始值已设置。
但是当窗体在模板中呈现时,这些字段没有这些初始值。模板中的两个字段的字段值均为“无”。
我试图检查使用值:
{{ form.field_one.value }}
{{ form.field_two.value }}
,输出是:
无
无
有任何人之前就遇到了这个问题?如何在表单呈现时在模板中显示初始值?
答
作为django.forms.Form
设置初始数据只有到一个未绑定的表单设置inital不是一个选项在这里。我们应该将初始值作为数据传递给haystack.views.FacetedSearchView
中的build_form
方法,因为这是初始化表单的地方。
实施例:
MySearchView(FacetedSearchView):
def build_form(self, form_kwargs=None):
""" Overrides the build_form method to send initial data
"""
form = super(MySearchForm, self).build_form(form_kwargs)
form_data = form.data.copy() # Need to copy this as QueryDict is immutable
# Set initial data hete
form_data['field_name'] = 'fields_inital_value'
form.data = form_data
return form