6

私がいくつかの考案されたモデルを持っているとしましょう:

class Author(Model):
   name = CharField()

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

そして、BookにModelFormを使用したいとします。

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

これまでのところ単純です。しかし、データベースに大量の著者がいて、そのような長い複数選択フィールドを持ちたくないともしましょう。したがって、BookFormの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'がありません。そこで、ModelFormのデフォルトのフィールドを上書きして、後で設定するという、次のようなことも試しました。

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

   class Meta:
      model = Book

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

同じ結果が得られます。

これがどのように行われるのか知っている人はいますか?

4

2 に答える 2

9

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
于 2009-04-10T18:36:19.747 に答える
8

フォーム オブジェクトには属性としてのフィールドがありません。辞書である "fields" 属性を調べる必要があります。

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

ここで何が起こっているのかを完全に理解したい場合は、この回答に興味があるかもしれません.これはモデルに関するものですが、フォームも同様に機能します.

于 2009-04-10T18:30:45.530 に答える