在haystack的FacetedSearchForm中设置字段的初始值

时间:2013-05-02 14:06:25

标签: django django-haystack faceted-search

我在其中一个项目中使用django-haystackSolr后端。我有一个继承自FacetedSearchForm的SearchForm。现在,我要做的是为表格中的一些字段添加一个初始值。

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代码和haystack代码,并喜欢FacetedSearchForm扩展haystack.forms.SearchForm扩展django.forms.Forms。所以我看不出为什么这不起作用的原因。

参考文献:

  1. haystack.forms.FacetedSearchForm
  2. django.forms.Form
  3. 我也尝试重写__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 }}
    

    ,输出为:

      

         

    以前有人遇到过这个问题吗?在呈现表单时,如何在模板中显示初始值?

1 个答案:

答案 0 :(得分:0)

由于django.forms.Form将初始数据设置为未绑定的表单设置inital不是此处的选项。我们应该将初始值作为数据传递给build_form中的haystack.views.FacetedSearchView方法,因为这是初始化表单的位置。

示例:

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