Странное поведение с ModelForm и сохранение - PullRequest
0 голосов
/ 29 июня 2009

Эта проблема очень странная, и я надеюсь, что кто-то может мне помочь. Ради аргумента, у меня есть модель Author с отношением ForeignKey к модели Book. Когда я показываю автора, я хотел бы иметь ChoiceField, который ТОЛЬКО отображает книги, связанные с этим автором. Поэтому я переопределяю метод AuthorForm. init () и создаю Список вариантов (кортежей) на основе запроса, который фильтрует книги на основе идентификатора автора. Кортеж представляет собой совокупность идентификатора книги и названия книги (т.е. (1, «Моби Дик»)). Затем эти «выборы» присваиваются атрибуту выбора ModelForm.

Когда форма отображается в шаблоне, ChoiceField отображается правильно, перечисляя только те книги, связанные с этим автором.

Здесь все становится странно.

Когда я сохраняю форму, я получаю ValueError (Невозможно назначить "u'1": Author.book "должен быть экземпляром Book). Эта ошибка имеет смысл из-за отношения FK. Однако, если я добавлю «напечатать» оператор в коде, не вносить никаких других изменений, а затем сохранить запись, она работает. Ошибка ValueError волшебным образом исчезает. Я пытался сделать это несколько раз, гарантируя, что случайно не внес другие изменения, и это работает каждый раз.

Кто-нибудь знает, что здесь происходит?

1 Ответ

2 голосов
/ 29 июня 2009

Не совсем уверен, что вы делаете неправильно, но лучше всего изменить набор запросов:

class ClientForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.affiliate = kwargs.pop('affiliate')
        super(ClientForm, self).__init__(*args, **kwargs)
        self.fields["referral"].queryset = Referral.objects.filter(affiliate = self.affiliate)

    class Meta:
        model = Client

Выше приведен один из моих проектов, и он отлично работает только для отображения объектов рефералов, связанных с переданным партнером:

form = ClientForm(affiliate=request.affiliate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...