2009-04-10 7 views
5

の選択肢を変更する方法:さんは、私はいくつかの不自然なモデルがあるとしましょうModelMultipleChoiceField

class Author(Model): 
    name = CharField() 

class Book(Model): 
    title = CharField() 
    author = ForeignKey(Author) 

をとの私は本のためのModelFormを使用したいとしましょう:

class BookForm(ModelForm): 
     class Meta: 
     model = Book 

シンプルなこれまでに。しかし、私のデータベースには1トンの著者がいますが、私はそのような長い選択肢のフィールドを望んでいません。だから、ブックフォームのModelMultipleChoiceField作成者フィールドでクエリーセットを制限することをお勧めします。私が望むクエリーセットは、渡される引数に依存するので、__init__まで選択することはできません。それはちょうど私がここではないでしょう働いていた場合、もちろん

class BookForm(ModelForm): 
    class Meta: 
     model = Book 

    def __init__(self, letter): 
     # returns the queryset based on the letter 
     choices = getChoices(letter) 
     self.author.queryset = choices 

:それはトリックを行う可能性がありますように

これがそうです。それは私にAttributeErrorを取得します。 'BookForm'オブジェクトには属性 'author'がありません。同じ結果を生成する

class BookForm(ModelForm): 
    author = ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Book 

    def __init__(self, letter): 
     choices = getChoices(letter) 
     self.author.queryset = choices 

:だから、私はまた、私はのModelFormのデフォルトのフィールドを無効にし、後でそれを設定しようと、このような何かを、試してみました。

これはどのように行われるのですか?属性は、あなたが辞書である「フィールド」属性に見る必要があるよう

答えて

8

フォームオブジェクトは、それぞれの分野を持っていない:

self.fields['author'].queryset = choices 

あなたは完全にここで何が起こっているのかを理解したい場合は、 this answerに興味があるかもしれません - それはModelsについてですが、Formsは同様に動作します。

7

Carlはフィールドについては正しいですが、スーパークラスコールもありません。これは私がそれを行う方法です:

class BookForm(ModelForm): 
    author = ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Book 

    def __init__(self, *args, **kwargs): 
     letter = kwargs.pop('letter') 
     super(BookForm, self).__init__(*args, **kwargs) 
     choices = getChoices(letter) 
     self.fields['author'].queryset = choices 
+0

ええ、私の本当の問題領域はスーパークラスの呼び出しを持っていますが、この例ではスキップしました。 – Brian

+0

十分に公正。私はこれを参照のためにこの質問にさまよっている人のために残しておきます。 –

+1

間違いなく。フィールドへのアクセスの前にsuper().__ init __()を実行する必要があることが重要です。 – Brian

関連する問題