私は、40,000行のモデルのForeignKey値である1つのフィールドを持つモデルフォームを持っています。デフォルトのmodelformは、40,000個のオプションを持つ選択ボックスを作成しようとします。このモデルフォームがフォームセットファクトリで使用されているときは、さらにそうです!モデルフォームのraw_id_fields
管理者は、これは "raw_id_fields
"を使用することで簡単に回避できますが、同等のモデルフォームはないようです。これどうやってするの?
class OpBaseForm(ModelForm):
base = forms.CharField()
class Meta:
model = OpBase
exclude = ['operation', 'routes']
extra = 0
raw_id_fields = ('base',) #does nothing
最初の太字の行は、巨大な扱いにくい選択ボックスを作成しないことによって動作しますが、私はこのフォームのフィールドセットを保存しようとすると、私はエラーを取得:「OpBase
は、ここに私のModelFormです。 base "は" Base "インスタンスでなければなりません。モデルフォームを保存するには、 'base'がBaseインスタンスである必要があります。明らかに、基本主キーの文字列表現では(少なくとも自動的には)十分ではありません。フォームに与えられた文字列をBaseインスタンスに変更するためには、何らかのメカニズムが必要です。そして、このメカニズムはformsetで動作しなければなりません。何か案は? raw_id_fields
しか動作しない場合、これはケーキとして簡単になります。しかし、私が知る限り、管理者だけが利用可能です。
明確にするために、raw_id_field属性はModelAdmin属性です。http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields ModelForm属性ではありません。 –