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

时间:2015-04-08 15:31:37

标签: python django django-models django-forms

我有一个模型表格:

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的低效率问题之外,它也不适合这种用法。

1 个答案:

答案 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并不适合所有情况。