10
Фев
2017

Как сделать валидацию формы в Django на основе модели?

Всем привет! Только начал осваивать Django, появился вопрос по валидации форм, на основе модели, не совсем понятно как ее делать, т.к. form.is_valid() проверяет форму уже по всем полям,но хотелось бы кастомную проверку, по определенным условиям:

Я создал модель:

models.py

from django.db import models
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator


class Feedback(models.Model):
    name = models.CharField(max_length=25,verbose_name="Имя",validators=[
        RegexValidator(
            regex='^[a-z]*$',
            message='Username must be Alphanumeric',
            code='invalid_username'
        ),
    ])
    email = models.EmailField()
    phone = models.CharField(max_length=12,verbose_name="Телефон")
    text = models.TextField(max_length=128)
    date = models.DateTimeField(auto_now_add=True,verbose_name="Дата")

    def __str__(self):
        return "Новый вопрос: %s %s" % (self.name, self.phone)

    class Meta:
        verbose_name = 'Вопросы клиентов'
        verbose_name_plural = 'Обратная связь'

На основе модели, создал форму:

forms.py

from django import forms
from django.forms import ModelForm
from .models import *


class FeedbackForm(forms.ModelForm):
    class Meta:
        model = Feedback
        exclude = ['date']

    widgets = {
        'name':forms.TextInput(attrs={'class':'fb_form','placeholder':'Ваше имя'}),
        'email':forms.TextInput(attrs={'class':'fb_form','placeholder':'E-mail адрес'}),
        'phone':forms.TextInput(attrs={'class':'fb_form','placeholder':'Контактный телефон'}),
        'text': forms.Textarea(attrs={'class':'fb_form','placeholder':'Ваше сообщение','rows':20, 'cols':40})
    }

И сама вьюшка:

views.py

def feedback(request):
    form = FeedbackForm(request.POST or None)

    if request.method == "POST" and form.is_valid():
        name = form.cleaned_data['name']
        email = form.cleaned_data['email']
        phone = form.cleaned_data['phone']
        text = form.cleaned_data['text']

        try:
            send_mail(name,text+'\n'+email+'\n'+phone,'test@yandex.ru',['test@yandex.ru'], fail_silently=False)
            new_form = form.save()
            return HttpResponse('yes :)') 
        except BadHeaderError:
            return HttpResponse('Invalid header found')
    else:
        form = FeedbackForm()

    return render(request, 'feedback/feedback.html', locals())

Если создавать записи из админки, то валидация через RegexValidator отрабатывает, при вводе неправильного символа - сразу видно уведомление.

А как сделать кастомную валидацию формы на основе модели, чтобы результат был виден на веб-страничке?

В инете много примеров, где делают валидацию сразу в forms.py, не на базе модели, без нее получается задать свои условия проверки, а с моделью - не понимаю как.

Можно пример, как это должно быть?

Источник: https://ru.stackoverflow.com/questions/625920/%D0%9A%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8E-%D1%84%D0%BE%D1%80%D0%BC%D1%8B-%D0%B2-django-%D0%BD%D0%B0-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8

Share

Тебе может это понравится...