2015-07-01 3 views
1

У меня есть набор специальных форм, которые относятся к одной модели, я определил общее:Джанго образуют как создать простой подмешать

class myBaseFormMixin(forms.Form):  
    data_prod = forms.DateField(initial=datetime.date.today, label='Data') 

    class Meta: 
    model = mymodel 

    def clean(self): 
     if self.data["a"]=='off': 
      raise forms.ValidationError("check A") 

затем в моем specialform добавил:

class SpecialManForm(forms.ModelForm,myBaseFormMixin) 
def __init__(self, *args, **kwargs): 
     super(SpecialManForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(

      Fieldset(
       'Description', 
       Row(
       Div('field_a', css_class='large-3 columns '), 
       ), 
      ), 

все в порядке, по-видимому, в форме все поля из модели в Meta Mixin доступны, но чистые() из Mixin не выполняется, это будет работать, если я добавляю в четкости гр lean() в SpecialManForm, почему это происходит?

Я что-то упустил? заранее спасибо

ответ

0

Я решил с наследованием:

class myBaseFormMixin(forms.ModelForm): 

потом специальная форма:

class SpecialManForm(myBaseFormMixin) 
+0

Так у вас есть дополнительный класс, который на самом деле не нужен сейчас. –

+0

Зачем ты так говоришь? только один класс используется в качестве базы для других ... так: SpecialManForm -> ModelForm -> myBaseFormMixin, стал SpecialManForm -> myBaseFormMixin – user2239318

+0

Ну, вы спросили, как использовать mixins, и вот что мой ответ показал вам, как это сделать. Они эффективно выполняют одно и то же, но мое решение использует меньше кода и создает меньше классов. –

1

Вы должны изменить свой SpecialManForm, чтобы он сначала использовал ваш микшинг.

class SpecialManForm(myBaseFormMixin, forms.ModelForm) 
    def __init__(self, *args, **kwargs): 
     .... 

Когда питон ищет чистый метод, он сначала проверить класс SpecialManForm, где он не реализован. Затем он будет проходить через наследственную иерархию, что означает сначала проверку модели ModelForm (как у вас в настоящее время). Он реализован там, поэтому он будет использовать код из ModelForm, а не из вашего mixin, и выполнить его.

Изменение порядка в определении класса означает, что он проверит ваш микшинг перед классом ModelForm для чистого метода и использует метод, который вы реализовали.

Он проверяет (вашу версию) в следующем порядке: SpecialManForm -> ModelForm -> myBaseFormMixin, и это объясняет, почему это сработало, когда вы добавили метод в SpecialManForm.

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

  • Нет связанных вопросов^_^