【问题标题】:set field's initial value within haystack's FacetedSearchForm在 haystacks 分面搜索表单中设置字段初始值
【发布时间】:2013-05-02 14:06:24
【问题描述】:

我在我的一个项目中使用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

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

这也不起作用。

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

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

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

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

输出是:

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

【问题讨论】:

    标签: django django-haystack faceted-search


    【解决方案1】:

    作为django.forms.Form 将初始数据设置为未绑定的表单,此处不能选择设置初始值。我们应该将初始值作为数据传递给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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-23
      • 2014-04-18
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多