Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top