2014-02-19 32 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

順便說一句,如果您認爲它足夠好,請不要忘記標記我的答案爲答案。 –