如何在Context Processor(Django 1.3)中使用包含ChoiceField的HayStack表单?

时间:2011-05-02 21:26:59

标签: django solr django-haystack

我有一个非常简单的干草堆形式,看起来像这样:

class BasicSearchForm(SearchForm):    
    category_choices = Category.objects.all()
    category_tuples = tuple([(c.id, c.name) for c in category_choices])
    category = forms.ChoiceField(choices=category_tuples, required=False)

    def search(self):
        sqs = super(BasicSearchForm, self).search()

        if self.cleaned_data['category']:
            if self.cleaned_data['category'] != "*":
                sqs = sqs.filter(category__id=self.cleaned_data['category'])

        return sqs

然后我有一个像这样的上下文处理器:

def search_form(request):
    basic_search = BasicSearchForm()
    return { 'basic_search': basic_search }

出于某种原因,创建一个新的类别对象(通过Django管理员,并保存它)将不会更新我在形式的ChoiceField中使用的类别元组,直到我重新启动Apache。

有谁知道造成这种情况的原因是什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

看一下这篇博客文章,它会处理你的情况:

http://blog.e-shell.org/130

  

但是,有一个问题。   这样做,选择列表   将生成每个字段   启动时间(当你启动时   django开发服务器或apache或   lighttpd或者nginx或者你是什么   使用)。这意味着,如果你添加一个   它是维护者组的新用户   不会出现在维护者身上   字段,直到您重新启动服务器!

     

为避免这种情况,我们需要添加   使用前当前可用的选择   表单,覆盖默认列表   选择:

您希望在启动表单时设置选项:

class BasicSearchForm(SearchForm):    
    def __init__(self, *args, **kwargs):
        super(BasicSearchForm,self).__init__(*args,**kwargs)
        category_choices = Category.objects.all()
        category_tuples = tuple([(c.id, c.name) for c in category_choices])
        self.fields['category'] = forms.ChoiceField(choices=category_tuples, required=False)

    def search(self):
        sqs = super(BasicSearchForm, self).search()

        if self.cleaned_data['category']:
            if self.cleaned_data['category'] != "*":
                sqs = sqs.filter(category__id=self.cleaned_data['category'])

        return sqs