【问题标题】:Render ForeignKey field as a text field in form but keep foreign key behaviour将 ForeignKey 字段呈现为表单中的文本字段,但保留外键行为
【发布时间】:2018-11-09 15:51:35
【问题描述】:

这个问题看起来既愚蠢又简单,但我真的想不通。 我有一个模型与另一个模型的外键字段,可以说:

class Parent:
  name = models.CharField()

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

我用默认的 django 表单渲染子实例,没有任何添加。如果很重要,我会使用inlineformset_factory(Parent, Child, extra=1)

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

它呈现为我想要的字符域。但是这里不再是验证和智能转换 id 到实例了。如果我写了不正确的 parent_id,我会得到“无法分配“u'21'”:“Children.parent”必须是“父”实例。”错误。

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

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

【问题讨论】:

    标签: django forms


    【解决方案1】:

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

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

    【讨论】:

    • 哦,我试图为模型中的字段设置小部件,而不是表单。成功了,谢谢!
    猜你喜欢
    • 2021-11-16
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多