Найти - Пользователи
Полная версия: Сложная форма
Начало » Django » Сложная форма
1
andreiru
Здравствуйте!

Есть модель 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
а что не понятно? что не получается?
andreiru
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'Цвет кузова')

И потом через clean хотел:

   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]

Так наверное совсем не правильно ?
FishHook
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>
andreiru
FishHook
Спасибо, буду пробовать !
andreiru
Выдает ошибку

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')

В чем может быть проблема ?
FishHook
Модели покажи
Singularitty
FishHook
как понять то что ты написал ?
fongostev
Singularitty
FishHookкак понять то что ты написал ?
Миксин для обработки вложенной формы, или поля-формы, если угодно. Три стандартных метода: построение объекта, проверка и сохранение. Все довольно просто.)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB