干草堆的设置字段的初始值FacetedSearchForm

干草堆的设置字段的初始值FacetedSearchForm

问题描述:

我在其中一个项目中使用django-haystackSolr后端。我有一个从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。所以我不明白为什么这不应该工作。

参考文献:

  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] 

这也不起作用。

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

但是当窗体在模板中呈现时,这些字段没有这些初始值。模板中的两个字段的字段值均为“无”。

我试图检查使用值:

{{ 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