将ForeignKey字段呈现为表单中的文本字段,但保留外键行为

时间:2018-11-09 15:51:36

标签: django forms

这个问题看起来很愚蠢,但是我真的不明白。 我有一个模型,其中的外键字段指向另一个模型,可以这样说:

class Parent:
  name = models.CharField()

class Child:
  name = models.CharField()
  e_id = models.IntegerField()
  parent = models.ForeignKey(Parent)

我用defalt django形式渲染Child实例,没有任何添加。如果重要,我会使用inlineformset_factory(Parent, Child, extra=1)

关键时刻:django将parent(这是一个外键)呈现为下拉输入。我需要以简单的文本输入而不是下拉列表的形式显示父母的ID。但是我想保留外键的所有行为,并让django验证parent_id输入的内容是Patent模型的有效和现有ID。

我试图创建一个这样的ChildForm:

class ChildForm(django.forms.ModelForm):
    class Meta:
        model = Child
        fields = ('name', 'e_id', 'parent')

    parent = CharField(label=_("Parent"), required=True)

并像这样使用它:

inlineformset_factory(Parent, Child, extra=1)

它像我想要的那样呈现为charfield。但是,这里不再有ID的验证和智能转换。如果我输入了不正确的parent_id,则会得到“无法分配“ u'21'”:“ Children.parent”必须是“ Parent”实例。”错误。

所以我觉得我做错了。我找到了这个答案(Django form ForeignKey database field not as dropdown),但是它看起来像是种猴子修补程序,我不确定这是django方式。

那么正确的方法是什么?我使用Django 1.6。

1 个答案:

答案 0 :(得分:2)

您需要在此处更改的是小部件,而不是字段。窗口小部件负责将输入输出到HTML,而字段则负责验证。所以您只需要:

class ChildForm(django.forms.ModelForm):
    class Meta:
        model = Child
        fields = ('name', 'e_id', 'parent')
        widgets = {'parent': forms.TextInput}