繁体   English   中英

Django中外键模型字段的自定义表单字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM