[英]Custom form field for Foreign key model field in Django
我有一个模型表格:
class FooForm(forms.ModelForm):
Meta:
model = Bar
fields = ('baz', 'description')
我的酒吧课是:
class Bar:
baz = models.ForeignKey(Baz)
description = models.CharField(max_length=100)
问题是Baz类有很多条目,并且正如django的文档所说,它对低效率的baz字段使用ModelChoiceField :
class ModelChoiceField(** kwargs)
允许选择单个模型对象,适合于表示外键。 请注意,当条目数增加时,用于ModelChoiceField的默认小部件将变得不切实际。 您应该避免将其用于100多个项目。
问题是我找不到如何避免使用它。
换句话说,我想知道如何更改“ 模型”字段与“ 表单”字段之间的默认映射,以及如何将另一个字段用于“外键”字段?
同样在我的特殊情况下,我只想在ModelForm中显示 baz字段并被禁用,因此,除了ModelChoiceField的效率低下问题之外,这种用法也不适合。
最终,我找到了一个可以满足我的需求的解决方案,但我将接受更通用的答案,这些答案解释了在需要时避免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并不适合所有情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.