Валидация форм — задача

Доделайте сайт коллекционера компакт-дисков: создайте форму связи, через которую посетитель может предложить свой CD на обмен владельцу сайта.Форма должна содержать такие поля:

  • Имя (name), текстовая строка, не более 100 символов.
  • Электронная почта для обратной связи (email)
  • Название альбома (title), текстовая строка, не более 100 символов.
  • Исполнитель (artist), текстовая строка, не более 40 символов.
  • Жанр (genre), поле выбора из предустановленных значений.
  • Стоимость (price), числовое поле, десятичные числа; необязательное.
  • Комментарий (comment), многострочное текстовое поле; необязательное.

Форма должна проверяться. Для обмена может быть допущен только диск, исполнитель которого уже есть в коллекции владельца сайта.Форма должна быть доступна на главной странице. После заполнения формы данные из неё надо отправить по электронной почте, а пользователь должен быть переадресован на страницу /thank-you/.

Функция для отправки почты и шаблон страницы /thank-you/ есть в коде.Для проверки работы вам понадобится добавить несколько альбомов от имени администратора; для входа в систему используйте логин admin и пароль admin.

Подсказка:
Проверяйте форму с помощью метода clean_artist(), который может обращаться к модели и искать другие записи артиста.

Наличие определённых записей в базе лучше проверять с помощью count() или exists().

В случае ошибки валидации необходимо генерировать исключение.

Код forms.py:

from django import forms
from . models import GENRE_CHOICES, CD

class ExchangeForm(forms.Form):
    name = forms.CharField(max_length=100, label='Название')
    email = forms.EmailField(label='Почта')
    title = forms.CharField(max_length=100, label='Заголовок')
    artist = forms.CharField(max_length=40, label='Артист')
    genre = forms.ChoiceField(choices=GENRE_CHOICES, label='Жанр')
    price = forms.DecimalField(max_digits=5, decimal_places=2, label='Цена', required=False)
    comment = forms.CharField(widget=forms.Textarea, label='Комментарий', required=False)
    
    def clean_artist(self):
        artist_name = self.cleaned_data['artist']
        latest=CD.objects.filter(artist__icontains=artist_name.lower())
        if not latest.exists():
            raise forms.ValidationError("Артиста нет в базе!")       
        return artist_name

Архив проекта:





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: