ModelForm と保存に関する奇妙な動作
質問
この問題は非常に奇妙なので、誰かが私を助けてくれることを願っています。議論のために、Book モデルとのForeignKey関係を持つAuthorモデルを用意しました。著者を表示するとき、その著者に関連付けられた書籍のみを表示する ChoiceField が必要です。そのため、AuthorForm をオーバーライドします。初期化() メソッドを使用し、著者 ID に基づいて書籍をフィルタリングするクエリに基づいて選択肢のリスト (タプル) を作成します。タプルは書籍 ID と書籍名を組み合わせたものです (つまり、(1, 'Moby Dick'))。これらの「選択肢」は、ModelForm の Choices 属性に割り当てられます。
フォームがテンプレートでレンダリングされると、ChoiceField が適切に表示され、その著者に関連付けられた書籍のみがリストされます。
ここで事態は奇妙になります。
フォームを保存すると、ValueError が発生します (「u'1'" を割り当てることはできません:Author.book」は Book インスタンスである必要があります)。FK の関係により、このエラーは当然のことです。ただし、コードに「print」ステートメントを追加し、他に変更を加えずにレコードを保存すると、機能します。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
上記は私のプロジェクトの 1 つから直接抜粋したもので、渡されたアフィリエイトに関連する Referral オブジェクトのみを表示するのに完全に機能します。
form = ClientForm(affiliate=request.affiliate)