2014-02-19 4 views
2

Предположим, у меня есть модель автомобиля с маркой поля и владельцем модели, у которой есть два поля: имя и car_brand, тогда как последний должен быть одним из брендов автомобилей , Мне нужно иметь форму, в которой пользователю предлагается имя текстового поля и выпадающий выбор, заполненный всем фирменным наименованием экземпляров автомобилей. Как мне это достичь?Выбор варианта выбора 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

Другой вопрос: как он узнает, чтобы выбрать поле «бренд» из автомобиля для выбора, когда модели. ForeignKey (Car) не указывает, какое поле выбрать? – jazzblue

ответ

2

Вы могли бы просто определить __unicode__ метод на вашей Car модели, и я думаю, что он должен работать нормально. Как упоминал Даниил, форма может запутаться, так как вы переопределили виджетов. Я мог ошибаться, но я думал, что 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-CarBrand. Каким будет преимущество этого? – jazzblue

+1

Преимущество состоит в том, что вы не дублируете данные в поле Car.brand. В той модели автомобиля, которая определена таким образом, люди могут поместить все, что захотят, в эту область, и вы можете получить «Acura», «acura», «acira», «acra» и т. Д. Вам нужно добавить кучу программную логику для исправления или отслеживания различных вариантов написания одного и того же бренда. Если у вас есть отдельная модель CarBrand, гораздо проще исправить опечатки или ошибки, подобные этому, и буквально невозможно дублировать данные, если вы поместите уникальное ограничение в поле CarBrand.name. –

+0

Кстати, пожалуйста, не забудьте отметить мой ответ как ответ, если вы считаете, что это достаточно хорошо. –

Смежные вопросы