我有一个模型,其中一个字段是一个ForeignKey值,它的模型为40,000行。默认的模型形式尝试创建一个包含40,000个选项的选择框,至少可以说是不理想的。当这个模型在一个formset工厂中使用时更是如此!raw_id_fields for modelforms
在管理员中,通过使用“raw_id_fields
”很容易避免这种情况,但似乎没有模型等效。我怎样才能做到这一点?
这里是我的ModelForm:
class OpBaseForm(ModelForm):
base = forms.CharField()
class Meta:
model = OpBase
exclude = ['operation', 'routes']
extra = 0
raw_id_fields = ('base',) #does nothing
第一加粗线的工作原理是不是创造了巨大笨重的选择框,但是当我试图挽救这种形式的一个字段,我得到的错误:“OpBase。基地“必须是”基地“的实例。为了保存模型,'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属性。 – 2011-02-09 08:22:30