Форум сайта python.su
Здравствуйте!
Есть модель Car с несколькими foreign key
class Engine(models.Model): DISPLACEMENT_CHOICES = [(n, u'%s см³' % n) for n in [round((x * 0.1), 1) for x in xrange(5, 81)]] FUEL_CHOICES = ( (u'Бензин', u'Бензин'), (u'Дизель', u'Дизель'), (u'Газ', u'Газ') ) name = models.CharField(u'Имя', max_length=100, unique=True) displacement = models.FloatField(u'Объем', choices=DISPLACEMENT_CHOICES) fuel = models.CharField(u'Топливо', max_length=100, choices=FUEL_CHOICES) updated = models.DateTimeField(u'Дата изменения', auto_now=True) created = models.DateTimeField(u'Дата создания', auto_now_add=True) class Car(models.Model): YEAR_CHOICES = [(x, unicode(x)) for x in xrange(datetime.now().year, 1939, -1)] RUDDER_CHOICES = ((True, u'Левый'), (False, u'Правый')) user = models.ForeignKey(User, related_name=u'cars', verbose_name=u'Владелец') model = models.ForeignKey(Model, verbose_name=u'Модель') engine = models.ForeignKey(Engine, verbose_name=u'Двигатель') #и т.д
Офлайн
а что не понятно? что не получается?
Офлайн
ilnur
а что не понятно? что не получается?
class CarForm(forms.ModelForm): class Meta: model = Car exclude = ('user',) def __init__(self, *args, **kwargs): super(CarForm, self).__init__(*args, **kwargs) self.fields['brand'] = forms.ModelChoiceField(label=u'Марка', queryset=Brand.objects.all()) self.fields['model'] = forms.IntegerField(label=u'Модель', widget=forms.Select(attrs={'disabled': 'disabled'})) self.fields['body'] = forms.CharField(label=u'Номер кузова') self.fields['body_type'] = forms.ChoiceField( label=u'Тип кузова', choices=( (None, u'---'), (u'Седан', u'Седан'), (u'Хэтчбек', u'Хэтчбек'), (u'Универсал', u'Универсал'), (u'Купе', u'Купе'), (u'Минивэн', u'Минивэн'), (u'Фургон', u'Фургон'), (u'Пикап', u'Пикап'), (u'Кабриолет', u'Кабриолет'), (u'Лимузин', u'Лимузин') ) ) self.fields['body_color'] = forms.CharField(label=u'Цвет кузова')
def clean_body(self): body_name = self.cleaned_data.get('body_name') body_type = self.cleaned_data.get('body_type') body_color = self.cleaned_data.get('body_color') return Body.objects.get_or_create(name=body_name, type=body_type, color=body_color)[0]
Отредактировано andreiru (Апрель 7, 2014 07:18:15)
Офлайн
class FormFieldMixIn(object): FORMS = [] def __init__(self, *args, **kw): _kws = {} for field_name, _, _ in self.FORMS: kw_name = '%s_kw' % field_name _kws[field_name] = kw.pop(kw_name, {}) super(FormFieldMixIn, self).__init__(*args, **kw) for field_name, form_class, required in self.FORMS: form_name = '%s_form' % field_name form_kw = _kws[field_name] if self.data: form_kw['data'] = self.data if self.instance and not 'not_instance' in form_kw: form_kw['instance'] = getattr(self.instance, field_name) form_kw.pop('not_instance',1) setattr(self, form_name, form_class(prefix=form_name, **form_kw)) def is_valid(self): return super(FormFieldMixIn, self).is_valid() and\ all(getattr(self, '%s_form' % n).is_valid() for n,c,r in self.FORMS if r) def save(self, commit=True, subcommit=True): for field_name, form_class, required in self.FORMS: form = getattr(self, '%s_form' % field_name) if required or form.is_valid(): setattr(self.instance, field_name, form.save(subcommit)) else: setattr(self.instance, field_name, None) return super(FormFieldMixIn, self).save(commit)
class PersonForm(FormFieldMixIn, forms.ModelForm): FORMS = [ ('address', AdressForm, True), # ForeignKey-поле модели, класс формы, является ли заполнение сопутствующей формы обязательным ] class Meta: model=Person ecxlude=('address',) # миксин сам отрисует поле-форму, если не убрать поле из формы, оно продублируется
<form> {{ form }} {{ form.address_form }} <input type='submit' value='OK!' /> </form>
Офлайн
FishHookСпасибо, буду пробовать !
Офлайн
Выдает ошибку
DoesNotExist at /cars/
Car has no body.
if self.instance and not ‘not_instance’ in form_kw:
form_kw = getattr(self.instance, field_name)
class BodyForm(forms.ModelForm): class Meta: model = Body class CarForm(FormFieldMixIn, forms.ModelForm): FORMS = [ ('body', BodyForm, True), ] class Meta: model = Car exclude = ('user', 'body')
Отредактировано andreiru (Апрель 8, 2014 09:30:53)
Офлайн
Модели покажи
Офлайн
FishHook
как понять то что ты написал ?
Офлайн
SingularittyМиксин для обработки вложенной формы, или поля-формы, если угодно. Три стандартных метода: построение объекта, проверка и сохранение. Все довольно просто.)
FishHookкак понять то что ты написал ?
Офлайн