2014-02-19 98 views
2

假设我有一个模型车有一个现场品牌和一个模型所有者有两个字段:名称和car_brand,而后者应该是一个Car实例品牌。我需要一个表单,用户可以看到一个文本字段名称和一个下拉选择选项,其中包含Car实例的所有品牌名称。我将如何实现这一目标?Django模型选择选项,填充其他模型实例的字段

这是我开始的代码。随时纠正。谢谢。

models.py

from django.db import models 

class Car(models.Model): 
    brand = models.CharField(max_length=20) 

class Owner(models.Model): 
    name = models.CharField(max_length=20) 
    car_brand = models.ForeignKey(Car) 

forms.py

from django.forms import ModelForm, TextInput, Select 
from app.models import Owner 

class OwnerForm(ModelForm): 

    class Meta(): 
     model = Owner 
     fields = ("name", "car_brand") 
     widgets = { 
      "name" : TextInput(attrs={"class" : "name"}), 
      "car_brand" : Select(attrs={"class" : "car_brand"}), 
     } 
+0

你为什么重写小部件?默认的模型形式会给你你想要的东西。 –

+0

我需要为每个字段定义类属性。 – jazzblue

+0

另一个问题是:它如何知道从汽车中挑选“品牌”字段进行选择时,models.ForeignKey(Car)未指定要选择的字段? – jazzblue

回答

2

你很可能只是定义您Car模型__unicode__方法,我认为它应该工作的罚款。正如丹尼尔提到的,由于您已经重写了小部件,因此表单可能会变得混乱。我可能是错的,但我认为django会自动在可用于样式设计的表单元素上呈现属性。也许你不需要重写这些小部件。如果没有,你可以明确指定表单字段:

class OwnerForm(ModelForm): 
    car_brand = forms.ModelChoiceField(
     queryset=Car.objects.all(), 
     widget=Select(attrs={'class': 'car_brand'}), 
    ) 

    class Meta: 
     model = Owner 
     fields = ('name', 'car_brand') 
     widgets = { 
      'name': TextInput(attrs={'class': 'name'}) 
     } 

作为一个侧面说明,没有任何原因,你没有一个CarBrand模型和有关的Car模型给它的外键字段?这将是一种更为标准化的数据建模方法。

+1

谢谢。为什么我需要中间的另一个模型?现在我有车主的关系。随着额外的模型,我将拥有车主Car Carrand。这样做的好处是什么? – jazzblue

+1

优点是您不会在Car.brand字段中复制数据。以这种方式定义的汽车模型,人们可以把他们想要的任何东西放在这个领域,你可以用“Acura”,“acura”,“acira”,“acra”等等。你需要添加一堆程序逻辑来纠正或追踪同一品牌拼写的不同变化。如果你有一个独立的CarBrand模型,纠正错别字或者类似的错误要容易得多,如果你在CarBrand.name字段上设置一个唯一的约束,那么重复数据是不可能的。 –

+0

顺便说一句,如果您认为它足够好,请不要忘记标记我的答案为答案。 –