【问题标题】:Custom form field for Foreign key model field in DjangoDjango中外键模型字段的自定义表单字段
【发布时间】:2015-06-13 16:03:30
【问题描述】:

我有一个模型表格:

class FooForm(forms.ModelForm):
    Meta:
        model = Bar
        fields = ('baz', 'description')

我的酒吧课是:

class Bar:
    baz = models.ForeignKey(Baz)
    description = models.CharField(max_length=100)

问题在于 Baz 类 有很多条目,而 django's documentation says 它使用 ModelChoiceField 来表示效率非常低的 baz 字段:

类 ModelChoiceField(**kwargs)

允许选择单个模型对象,适合表示外键。请注意,当条目数量增加时,ModelChoiceField 的默认小部件变得不切实际。您应该避免将其用于超过 100 个项目。

问题是我找不到避免使用它的方法。

换句话说,我想知道如何更改 Model fieldForm field 之间的默认映射并使用另一个字段作为外键字段?

另外,在我的特殊情况下,我只想在我的 ModelForm 中 显示 baz 字段并被禁用,所以除了 ModelChoiceField 的低效率问题之外,它也不适合这种用法。

【问题讨论】:

  • 您可以创建一个适合您需要的小部件类并将其链接到 ModelChoiceField
  • 使用自定义小部件能解决问题吗?我的意思是它仍在使用 ModelChoiceField 和另一个 html representation
  • 我猜他们并不是说它效率不高,而是说从 100 多个项目中选择一个条目只是“不切实际”
  • @skndstry 在我看来,除了在输入时选择不切实际之外,它也效率低下,因为它确实从数据库中查询和选择所有对象

标签: python django django-models django-forms


【解决方案1】:

最后我找到了一个满足我需求的解决方案,但我会接受任何更一般的答案来解释什么是在需要时避免使用 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。

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2017-12-17
    • 1970-01-01
    • 2013-11-14
    • 2023-03-07
    相关资源
    最近更新 更多