Задать вопрос
@Flash90

Как динамически переопределить widgets для ModelForm?

Есть форма:
class RegistrationForm(forms.ModelForm) :

    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput)

    class Meta :
        model = User
        fields = ('username', 'email', 'date_birth', 'phone')
        widgets = {
            'date_birth' : forms.DateInput(format='%Y-%m-%d',
                                           attrs={'type' : 'date'}),
            'username' : forms.TextInput(attrs={}),
            'email' : forms.TextInput(attrs={'type' : 'email'}),
            'phone' : forms.TextInput(attrs={}),
        }

    def clean_password(self):
        print(self)
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2 :
            raise forms.ValidationError('Passwords dont match')
        return password1

    def save_form(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.set_password(self.cleaned_data['password1'])
        if commit:
            user.save()
        return user

Необходимо , что бы при некорректном заполнении, возвращалась форма с указанием на ошибки(в данном случае меня интересует просто добавление класса CSS 'error-form' в некорректно заполненные поля widgets). Желательно это сделать без js. Изначально подумал что можно переопределить widgets для экземпляра класса , что то типа :
self.Meta.widgets[key].attrs['class'] = 'error_form' , но при этом переопределяется весь класс.
Можно ли как то переопределить widget только для экземпляра или может существует более правильный метод.
  • Вопрос задан
  • 245 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@marazmiki
Укротитель питонов
Да, это штатная возможность:

class RegistrationForm(forms.ModelForm) :
    error_css_class = 'error-form'
Ответ написан
Комментировать
zelsky
@zelsky
Если я вас правильно понял. То в джанге уже предусмотрено.
def foo(request):
    messages.success(request, "Huge success!")
    return render(request, 'index.html')

{% for message in messages %}
    <div class="alert alert-{{ message.tags }}">{{ message }}</div>
{% endfor %}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы