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

Gre*_*reg 9 python django django-models django-forms django-views

这就是我想要做的.我想知道是否有人可以建议一个好方法:

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()
Run Code Online (Sandbox Code Playgroud)

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

Enter Dog Request:
---------------------
color (dropdown V)
speed (dropdown V)
|save|
Run Code Online (Sandbox Code Playgroud)

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

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

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())
Run Code Online (Sandbox Code Playgroud)

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

Sea*_* W. 10

我不认为你想在这里使用ModelForm.没有一些hackery它永远不会有效,因为在调用之前你不会找到或创建dog对象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())
Run Code Online (Sandbox Code Playgroud)

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

data = {
    'id': dog_request_id,
    'color': dog_color,
    'speed': dog_speed,
}
form = DogRequestForm(data)
Run Code Online (Sandbox Code Playgroud)

在那里你填充电流dog_request_id,dog_colordog_speed从现有DogRequest的对象.