2016-06-15 4 views
0

Django 1.9.7UpdateView и CreateView разделяют общие функции JavaScript

Обновление и создание более или менее подобные операции. Иногда я хотел бы добавить события JavaScript в качестве виджета attrs. Например, пользователи выбирают пол. В зависимости от этого я хотел бы показать или скрыть девичье имя. Это всего лишь пример некоторой операции, общей для UpdateView и CreateView.

Я попытался организовать его как микс, но не удалось: UpdateView и CreateView используют FormMixin. Если я организую другой mixin, наследующий FormMixin, я получаю столкновение.

Не могли бы вы помочь мне понять, как справиться без повторения кода?

class PersonUpdateView(UpdateView): 
    model = Person 
    fields = ['gender', 'last_name'] 

class PersonCreate(CreateView): 
    model = Person 
    fields = ['gender', 'last_name'] 
    redirect_name = "people" 

    field_attrs = {'gender': {'onchange':"alert('G')"}, 
        'last_name': {'onclick': "alert('LN')"}, 
        }  

    def get_form(self, form_class=None): 
     form = super(PersonCreate, self).get_form(form_class) 
     for key, value in self.field_attrs.items(): 
      form.fields[key].widget.attrs = value; 
     return form 

ответ

0

Ваш Mixin должен быть простой класс:

class CreateUpdateMixin(object): 

    model = Person 
    fields = ['gender', 'last_name'] 

    field_attrs = {'gender': {'onchange':"alert('G')"}, 
        'last_name': {'onclick': "alert('LN')"}, 
        } 

Тогда вы используете его так:

class PersonUpdateView(CreateUpdateMixin, UpdateView): 
    pass 

class PersonCreate(CreateUpdateMixin, CreateView): 
    redirect_name = "people" 

    def get_form(self, form_class=None): 
     form = super(PersonCreate, self).get_form(form_class) 
     for key, value in self.field_attrs.items(): 
      form.fields[key].widget.attrs = value; 
     return form 
+0

solarissmoke, спасибо за ответ. Но я не могу понять эту идею. Вы предлагаете переопределить метод get_form в PersonCreate и в PersonUpdateView? Тогда mixin не знает об этих представлениях. Но взгляды знают о микшине. Специальный код представлен в виде: поля и их атрибуты. Общий код должен быть в mixin. В любом случае, кажется, что вы предлагаете дублирование кода, если я правильно вас понимаю. И это сложнее, чем просто переопределить методы get_form без каких-либо миксинов. Простите, если я не пойму эту идею. – Michael

+0

Извините, похоже, я не понял ваш вопрос. Я не совсем понимаю ваш комментарий или, к сожалению ... – solarissmoke

+0

solarissmoke, пожалуйста, извините, если бы я был неуклюжим в объяснениях. Я справился с проблемой, используя mixin. Не так, как вы предполагали, но он отлично работает. Спасибо за Вашу поддержку. – Michael

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