1

我在我的一个项目中使用django-haystack后端Solr。我有一个继承自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 代码和 haystack 代码,并且喜欢FacetedSearchFormextends haystack.forms.SearchFormwhich extends django.forms.Forms。所以我看不出这不起作用的原因。

参考:

  1. haystack.forms.FacetedSearchForm
  2. django.forms.Form

我还尝试覆盖该__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)

但是在 aFacetedSearchForm中没有fields属性,尽管它们提供对base_fields对象的访问,所以我尝试这样做:

self.base_fields[value].initial = values[value][4]

这也不起作用。

当我意识到它不会引发任何错误或异常时,奇怪的部分来了,所以我尝试打印出初始值进行调试,它确实表明初始值已设置。

但是当表单在模板中呈现时,字段没有那些初始值。对于模板中的两个字段,字段的值为 None。

我尝试使用以下方法检查值:

{{ form.field_one.value }}
{{ form.field_two.value }}

输出是:

没有任何

没有任何

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

4

1 回答 1

0

由于django.forms.Form将初始数据设置为未绑定的表单设置 inital 在这里不是一个选项。我们应该将初始值作为数据传递给方法, 因为这是初始化表单的地方。build_formhaystack.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
于 2013-05-03T10:29:28.530 回答