Доделайте сайт коллекционера компакт-дисков: создайте форму связи, через которую посетитель может предложить свой 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
Архив проекта: