Django - 如何为模型的外键制作表单?

Posted

技术标签:

【中文标题】Django - 如何为模型的外键制作表单?【英文标题】:Django - How to make a form for a model's foreign keys? 【发布时间】:2011-08-08 21:11:12 【问题描述】:

这就是我想要做的。我想知道是否有人可以提出一个好的方法:

models.py:

class Color(models.Model):
    name = models.CharField(...

class Speed(models.Model):
    name = models.CharField(...

class Dog(models.Model):
    name = models.CharField(...
    color = models.ForeignKey(Color...
    speed = models.ForeignKey(Speed...

class DogRequest(models.Model):
    dog = models.ForeignKey(Dog...
    request_time = models.DateTimeField()

现在我想要一个用户可以输入或编辑 DogRequest 的页面,但表单应如下所示:

Enter Dog Request:
---------------------
color (dropdown V)
speed (dropdown V)
|save|

那么我将如何在视图中设计该表单?问题是用户将输入狗的属性,而不是狗的属性。所以我需要根据用户输入的内容来查找或创建狗记录。

到目前为止,我已经尝试过这样的事情:

class DogRequestForm(ModelForm):
    class Meta:
        model = DogRequest
        fields = ('request_time','color','speed')
    color = forms.ModelChoiceField(queryset=Color.objects.all())
    speed = forms.ModelChoiceField(queryset=Speed.objects.all())

现在假设即使有效,我应该将代码放在哪里,以根据输入的颜色和速度来确定要使用(或创建)的 Dog 记录?以及如何从 DogRequest 填写表格?

【问题讨论】:

【参考方案1】:

我认为您不想在这里使用 ModelForm。没有一些hackery,它永远不会有效,因为在调用is_valid()之前你不会找到或创建狗对象。

相反,我只是使用常规表单,然后重写 DogRequest 的 save 方法来查找或创建狗。

更新:回复评论中的后续问题,我没有对此进行测试,但类似的东西应该可以工作。

class DogRequestForm(forms.Form):
    id = forms.IntegerField(required=False, widget=forms.HiddenInput())
    color = forms.ModelChoiceField(queryset=Color.objects.all())
    speed = forms.ModelChoiceField(queryset=Speed.objects.all())

然后,当您为编辑视图创建此表单的实例时,您需要使用以下内容对其进行实例化:

data = 
    'id': dog_request_id,
    'color': dog_color,
    'speed': dog_speed,

form = DogRequestForm(data)

从现有的DogRequest 对象填充当前的dog_request_iddog_colordog_speed

【讨论】:

啊,好吧,你是说创建一个新表单,而不是链接到 DogRequest?因此,如果用户正在编辑现有的 DogRequest,我应该如何将表单的数据链接到该特定记录?我需要在表单中添加一个隐藏的 ID 字段吗? 有没有简单的方法来添加隐藏字段? SO 上的方法看起来既费力又复杂。 @Greg 您是否尝试过 editable=False 创建隐藏字段?您可以编辑您查看的值,但它会从表单中省略。 docs 很抱歉,我无法为此创建视图功能。这行form = DogRequestForm(data) 是否进入表单有效查询??

以上是关于Django - 如何为模型的外键制作表单?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest API,如何为 2 个模型条目创建 post api,并具有与模型关联的外键

最初在 django 内联表单集中设置不同的外键值

Django ForeignKey 模型表单

姜戈。从表单对象访问模板中的外键字段

django:如何从包含外键的多个模型中制作一个表单

django admin中的外键表单字段