Страница отзывов на Django 1.4

категория: Django
Сегодня будем писать страничку для отзывов писателей книги, реализация http://cryptohistory.ru/reviews/. Пользователь прочитал книгу и хочет поделиться своими впечатлениями о прочитанном. Делаем формочку в которой читатель будет писать имя, почтовый ящик и само сообщение, автоматом будем добавлять дату отзыва, добавим капчу от спама. Фома будет отправляться обработчику, проверяться на валидацию, сохраняться в базу и на той же странице будет выводиться. Еще добавим отзывы в админку, чтоб была возможность их редактировать и удалять. Создаем приложение "reviews" и добавляем его в settings.py в INSTALLED_APPS. Пишем модель Review и из нее делаем форму с помощью ModelForm. Подробно описывать не буду - все как обычно. models.py:
#! coding: utf-8
from django.db import models
from django.forms import ModelForm, Textarea
#каптча, как ее подключать описывалось ранее
from captcha.fields import CaptchaField
#
#
#Отзывы читателей
class Review(models.Model):
    name = models.CharField('Имя:', max_length=100)
    mail = models.EmailField('Электронный адрес:', max_length=100)
    created = models.DateField('Дата отзыва:', auto_now_add=True)
    text = models.TextField('Сообщение:')
#
    class Meta:
        ordering = ['-created']
        verbose_name = 'Отзыв'
        verbose_name_plural = 'Отзывы'
#
    def __unicode__(self):
        return "%s" % self.name
#
#
#Формочка
class ReviewForm(ModelForm):
#каптча, как ее подключать описывалось ранее
    captcha = CaptchaField(label="Проверочный код:")
#
    class Meta:
        model = Review
        widgets = {
            'text': Textarea(attrs={'cols': 80, 'rows': 10}),
        }
Ссылочка в urls.py получится приблизительно такая:
url(r'^reviews/$', ReviewCreateView.as_view(), name='reviews'),
Не забываем подтянуть вьюшку:
from reviews.views import ReviewCreateView
Забыл еще добавить ссылку:
url(r'^success/$', TemplateView.as_view(template_name='success.html')),
- при успешной валидации будет редирект на success.html, внутри которого будет что-то подобное: "Спасибо за отзыв". Дальше переопределим CreateView из Class-based generic views. Нужно добавить контекст к представлению и вывести информацию из базы на той же странице, будем использовать метод "get_context_data":
from django.views.generic import CreateView
from reviews.models import Review, ReviewForm
#
#
class ReviewCreateView(CreateView):
    form_class = ReviewForm
    template_name = 'reviews.html'
    #если данные прошли валидацию - редирект
    success_url = '/success/'
#
    def get_context_data(self, **kwargs):
        context = super(ReviewCreateView, self).get_context_data(**kwargs)
	#выбераем все отзывы и добавляем к контексту
        context['reviews'] = Review.objects.all()
        return context
Остается добавить отзывы в админку для возможности управления ими - не все могут писать приятные слова))
from django.contrib import admin
from reviews.models import Review
#
#
class ReviewAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['name', 'mail', 'created', 'text']})
    ]
    list_display = ['name', 'mail', 'created']
    readonly_fields = ['created']
    ordering = ['-created']
#
admin.site.register(Review, ReviewAdmin)
Не забудьте про readonly_fields = ['created'], а то будет много матов в дебагере, так как дату 'created' редактировать нельзя. Это последняя статья из серии "как я писал сайт cryptohistory.ru". Пора начинать что-то новое пилить и походу дела дальше буду что-то коментить. Если кого интересуют какие-то другие части кода моих сайтов - спрашивайте, а если можете что-то посоветовать или покритиковать - буду очень благодарен.


blog comments powered by Disqus