如何使用在上下文处理器(Django 1.3)中包含ChoiceField的HayStack表单?

如何使用在上下文处理器(Django 1.3)中包含ChoiceField的HayStack表单?,django,solr,django-haystack,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=Fal

我有一个非常简单的草垛形状,看起来就像这样:

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 }
出于某种原因,创建一个新的category对象(通过Django admin并保存它)不会更新我在表单的ChoiceField中使用的category元组,直到我重新启动Apache

有人知道这是什么原因吗


提前谢谢

看看这篇博文,它涉及到你的情况:

但是,这有一个问题。 这样做,选择列表 对于每个字段,将在 启动时间(当您启动 django开发服务器或apache或 lighttpd或nginx或任何你想要的东西 使用)。这意味着如果你添加一个 维护者组的新用户,it 不会出现在维护程序中 字段,直到您重新启动服务器

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

无论何时启动表单,都要设置选项:

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

啊!我就知道!我忘了给super的init打电话,所以我最终打破了它(当我试图自己定义init时)!谢谢你的回复!我希望这能奏效。这篇文章通过在视图中创建表单后设置选项来实现这一点,但我认为这应该做同样的事情。如果这不符合我的想法,我会编辑这篇文章来关注博客。好运气,很有魅力,非常感谢。我之前也很亲密>_