0

我有一个非常简单的 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。

有谁知道这可能是什么原因造成的?

提前致谢!

4

1 回答 1

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
于 2011-05-02T22:15:44.690 回答