これは私を悩ませている単なる好奇心です。データベースからのドキュメントの選択を処理する Form クラスを作成しました。当然、データベースからドキュメントのリストを取得して、利用可能な選択肢を設定する必要があります。選択肢を手動で作成し、ChoiceField を使用すると、「古い」動作が発生します。しかし、ModelChoiceField オプション "queryset" を利用すると、正確な結果が得られます。
「古い」とは、新しいドキュメントをアップロードしてページをレンダリングすると、古いドキュメント セットのみがリストに表示されることを意味します (ページの更新後も保持される場合があり、ビュー ロジックに従ってフォームを再生成する必要があります)。これは、ユースケースに関係なく、2 番目の方法が期待どおりに機能するという事実です)。例は次のとおりです。
古いバージョン:
class GetDocumentForm(forms.Form):
document_query = Document.objects.all().order_by('docfile')
document_choices = []
for document in document_query:
document_choices.append((document.id, document.docfile.name))
document = forms.ChoiceField(label='', choices=document_choices)
正確なバージョン:
class GetDocumentForm(forms.Form):
document = forms.ModelChoiceField(queryset=Document.objects.all())
何を与える?違いは何ですか?なぜ彼らは異なる振る舞いをするのですか?