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 管理者を介して) 新しいカテゴリ オブジェクトを作成し、それを保存しても、Apache を再起動するまで、フォームの ChoiceField で使用されているカテゴリ タプルが更新されません。

誰がこれを引き起こしているのか知っていますか?

前もって感謝します!

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 に答える