Как изменить выбор ModelMultipleChoiceField - PullRequest
5 голосов
/ 10 апреля 2009

Допустим, у меня есть несколько надуманных моделей:

class Author(Model):
   name = CharField()

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

И скажем, я хочу использовать ModelForm для Книги:

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

Пока все просто. Но давайте также скажем, что у меня есть тонна авторов в моей базе данных, и я не хочу иметь такое длинное поле множественного выбора. Итак, я хотел бы ограничить набор запросов в поле автора BookMorm 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

Который дает тот же результат.

Кто-нибудь знает, как это должно быть сделано?

Ответы [ 2 ]

8 голосов
/ 10 апреля 2009

Объекты формы не имеют своих полей в качестве атрибутов, вам нужно искать в атрибуте «fields», который является словарем:

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

Если вы хотите полностью понять, что здесь происходит, вас может заинтересовать этот ответ - он о моделях, но формы работают аналогично.

7 голосов
/ 10 апреля 2009

Хотя Карл и прав насчет полей, вы также пропускаете вызов суперкласса. Вот как я это делаю:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...