这个问题看起来很愚蠢,但是我真的不明白。 我有一个模型,其中的外键字段指向另一个模型,可以这样说:
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。
答案 0 :(得分:2)
您需要在此处更改的是小部件,而不是字段。窗口小部件负责将输入输出到HTML,而字段则负责验证。所以您只需要:
class ChildForm(django.forms.ModelForm):
class Meta:
model = Child
fields = ('name', 'e_id', 'parent')
widgets = {'parent': forms.TextInput}