我有一个模型表格:
class FooForm(forms.ModelForm):
Meta:
model = Bar
fields = ('baz', 'description')
我的Bar课程是:
class Bar:
baz = models.ForeignKey(Baz)
description = models.CharField(max_length=100)
问题是 Baz类有很多条目,而django's documentation says它使用ModelChoiceField来表示非常低效的baz字段:
类ModelChoiceField(** kwargs)
允许选择适合表示外键的单个模型对象。请注意,当条目数增加时,ModelChoiceField的默认小部件变得不切实际。你应该避免使用它超过100个项目。
问题是我找不到如何避免使用它。
换句话说,我想知道如何更改模型字段到表单字段之间的默认映射,并为外键字段使用另一个字段?
另外在我的特殊情况下,我只想在我的ModelForm中显示 baz字段并被禁用,因此除了ModelChoiceField的低效率问题之外,它也不适合这种用法。
答案 0 :(得分:0)
最后,我找到了满足我需求的解决方案,但我会接受任何更一般的答案,解释在需要时避免使用ModelChoiceField的最佳做法:)
我只需要将FooForm更改为:
class BuzCustomField(forms.CharField):
def clean(self, value):
"""
Validates the given value and returns its "cleaned" value as an
appropriate Python object.
Raises ValidationError for any errors.
"""
value = self.to_python(value)
value = Buz.objects.get(value)
self.validate(value)
self.run_validators(value)
return value
class FooForm(forms.ModelForm):
baz = forms.BuzCustomField()
Meta:
model = Bar
fields = ('baz', 'description')
我再次提到我只需要显示 baz 所以使用BuzCustomField并不适合所有情况。