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_id
、dog_color
和dog_speed
。
【讨论】:
啊,好吧,你是说创建一个新表单,而不是链接到 DogRequest?因此,如果用户正在编辑现有的 DogRequest,我应该如何将表单的数据链接到该特定记录?我需要在表单中添加一个隐藏的 ID 字段吗? 有没有简单的方法来添加隐藏字段? SO 上的方法看起来既费力又复杂。 @Greg 您是否尝试过 editable=False 创建隐藏字段?您可以编辑您查看的值,但它会从表单中省略。 docs 很抱歉,我无法为此创建视图功能。这行form = DogRequestForm(data)
是否进入表单有效查询??以上是关于Django - 如何为模型的外键制作表单?的主要内容,如果未能解决你的问题,请参考以下文章