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