суббота, 25 февраля 2012 г.

Опрос (ч.1)

Вас попросили создать веб-приложение для проведения опросов. Вы, как человек новатор, решили сделать его на веб-фреймворке Django.


Задание

Заказчик выслал вам скриншот того, что он хочет получить. 




Требования:
Frontend:
1. На странице отображать панель проводимого в данный период голосования.
2. Проголосовав, пользователь должен увидеть число голосов по каждому ответу.

Backend:

1. Создание опроса через админку.
2. У каждого опроса должна быть дата публикации.
3. Каждый опрос может иметь N вариантов ответа.
4. Число проголосовавших по каждому ответу можно задавать вручную.

Этап 1. Подготовка

1.1. Нам нужно разобраться с тем, как мы будем хранить данные. В одной таблице? В двух? Какова структура таблиц? Нарисуйте возможную схему таблиц базы данных на листе бумаги. Вот что у нас получилось:


 Схема БД

Полученный рисунок показывает идею, согласно которой данные будут храниться в базе данных.

1.2. Мы можем создать таблицы в БД вручную, но зачем? Ведь у нас есть Django! Его особенность состоит в том, что таблицы он создает сам на базе кода python. На следующем этапе мы напишем код моделей.

1.3. Очень важно настроить переменные среды вашей операционной системы. В Windows 7 переменная среды path настраивается через Панель управления - Система и безопасность - Система - Дополнительные параметры системы - Переменные среды.
Далее выбираем переменную Path и добавляем
C:\python27;C:\django\django\bin

Это в том случае, если у вас Python установлен по адресу C:\Python27 и Django установлен в папке C:\django


 
На этом этап подготовки заканчивается, и мы приступаем к написанию кода.

Этап 2. Написание кода моделей

Создадим проект firstsite, а в нем – приложение polls. Полный перечень операций в командной строке приведен на рисунке.

2.1. Откройте cmd.exe (Командная строка для Windows). Перейдите в директорию, где будете создавать свой проект:
cd C:\projects
2.2. Создайте проект firstsite в этой директории:
django-admin.py startproject firstsite
2.3. Перейдите в директорию созданного проекта:
cd firstsite
2.4. Создайте там приложение polls: 
python manage.py startapp polls

Создание приложения polls в командной строке

Если все было сделано верно, то вы увидите в папке firstsite файлы вашего проекта:

 Структура файлов проекта firstsite

Теперь приступим к созданию моделей в файле polls/models.py:

# -*- coding:utf-8 -*-

import datetime
from django.db import models
 
 
class Question(models.Model):
    """Вопрос"""
    title = models.CharField(max_length=200, verbose_name = "Вопрос")
    date_published = models.DateTimeField(verbose_name = "Дата публикации", 
        default = datetime.datetime.now())
    is_active = models.BooleanField(verbose_name = "Опубликован")

    def __unicode__(self):
        return self.title

    class Meta:
        verbose_name = 'Вопрос'
        verbose_name_plural = 'Вопросы'
 

class Answer(models.Model):
    """Вариант ответа на вопрос"""
    question_id = models.ForeignKey(Question)
    answer = models.CharField(max_length=200, verbose_name = "Ответ")
    votes = models.IntegerField(verbose_name = "Голосов", default = 0)

    def __unicode__(self):
        return self.answer

    class Meta:
        verbose_name = 'Ответ'
        verbose_name_plural = 'Ответы'

Примечание: По умолчанию текст файлов Django имеет кодировку ANSI. Чтобы избежать проблем с русскими символами, рекомендуется сменить кодировку используемых файлов на UTF-8. В Notepad++ это можно сделать командой "Кодировки" - "Преобразовать в UTF-8 (без BOM)".

Классы названы в единственном числе, т.к. они характеризуют сущность, на основе которой будут создаваться объекты: Question – вопрос, Answer – ответ. Это общепринятый стандарт, которому нужно следовать.

verbose_name = "Вопрос" – так будет называться поле question в админке.
max_length=200 – предельно допустимое число символов в поле.
default – позволяет задавать значение поля по умолчанию

Один вопрос может иметь много вариантов ответа, следовательно перед нами связь "один-ко-многим". Эта связь в Django реализуется выражением:
question_id = models.ForeignKey(Question)
Эта строка означает, что в создаваемой таблице поле question_id будет внешним ключом таблицы Question.

Если вы используете версию Pytnon 2.x, то для каждого класса обязательно использовать функцию __unicode__(self), которая позволяет вернуть объект в формате unicode. Лучше будет, если эта функция будет возвращать один-два элемента класса, например в классе Answer:

def __unicode__(self):
                        return self.answer

Здесь функция возвращает только формулировку ответа, а не число голосов и т.д.

Также обратите внимание на класс Meta, включенный в каждый класс модели. Из названия понятно, что этот класс содержит мета-данные о классе (описательного характера). В нашем случае это русское название модели в административном интерфейсе - для единственного и множественного числа.

Код моделей написан, можно генерировать на его основе таблицы. Однако сначала произведем настройку нашего проекта firstsite.

Продолжение - Опрос (ч.2)

Комментариев нет:

Отправить комментарий