Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2014 06:40:52

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложная форма

Здравствуйте!

Есть модель 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'Двигатель')
   
    #и т.д

Помогите разобраться с формой, нужен такой результат:



Офлайн

#2 Апрель 7, 2014 07:11:41

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Сложная форма

а что не понятно? что не получается?

Офлайн

#3 Апрель 7, 2014 07:17:43

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложная форма

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]

Так наверное совсем не правильно ?



Отредактировано andreiru (Апрель 7, 2014 07:18:15)

Офлайн

#4 Апрель 7, 2014 08:37:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сложная форма

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>



Офлайн

#5 Апрель 7, 2014 09:19:16

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложная форма

FishHook
Спасибо, буду пробовать !



Офлайн

#6 Апрель 8, 2014 09:30:35

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложная форма

Выдает ошибку

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)

Офлайн

#7 Апрель 8, 2014 10:38:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сложная форма

Модели покажи



Офлайн

#8 Апрель 8, 2014 10:39:55

Singularitty
От:
Зарегистрирован: 2012-02-02
Сообщения: 61
Репутация: +  5  -
Профиль   Отправить e-mail  

Сложная форма

Офлайн

#9 Апрель 13, 2014 21:19:04

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Сложная форма

Singularitty
FishHookкак понять то что ты написал ?
Миксин для обработки вложенной формы, или поля-формы, если угодно. Три стандартных метода: построение объекта, проверка и сохранение. Все довольно просто.)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version