понедельник, 27 августа 2012 г.

Django 1.3 Быстрое создание сайта

1. Откройте консоль командной строки, перейдя по пунктам

Пуск > Все программы > Стандартные > Командная строка




2. Перейдите в папку "django", набрав в консоли

cd C:\django\

и нажав Enter.



3. Введите в консоли

django-admin.py startproject mysite

и нажмите Enter для создания структуры сайта в папке mysite.



4. Перейдите в папку "mysite", набрав в консоли

cd mysite

и нажав Enter.



5. Запустите сервер для проверки, набрав в консоли

manage.py runserver

и нажав Enter.





6. Откройте браузер и перейдите по адресу

http://127.0.0.1:8000/

Если все сработало правильно, то вы увидите на странице следующее сообщение:



7. Чтобы выключить сервер, находясь в консоли командной строки нажмите сочетание клавиш Ctrl + C.

8. Перейдите в папку C:\django\mysite и откройте в редакторе файл settings.py.
Найдите хэш-массив DATABASES, управляющий установкой баз данных для вашего сайта и внесите в него следующие изменения для подключения базы данных sqlite3:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'C:/django/mysite/mysite.db',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

9. Теперь в консоли командной строки введите:

manage.py syncdb

и нажмите Enter для создания таблиц базы данных.



В результате будут созданы таблицы базы данных, для которой вас поросят создать суперпользователя:



Введите в консоль yes и нажмите Enter.



Введите имя superuser и нажмите Enter.



Введите email super@mail.ru и нажмите Enter.



Введите пароль pass и нажмите Enter.



Обратите внимание, что при вводе пароль невидим.

Далее повторно введите пароль pass и нажмите Enter.



После этого в консоли будет выведено сообщение, что таблицы базы данных вместе с суперпользователем были созданы успешно.



Заметим, что командна syncdb создает таблицы только для приложений прописанных в файле C:\django\mysite\settings.py в разделе INSTALLED_APPS.

10. Теперь создайте первое приложение polls. Введите в консоли

manage.py startapp polls

и нажмите Enter.



В результате в папке C:\django\mysite\ появится папка polls со структурой приложения для голосований.

11. Добавьте в файл C:\django\mysite\polls\models.py следующий код:

from django.db import models
import datetime

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __unicode__(self):
        return self.question
    def was_published_today(self):
        return self.pub_date.date() == datetime.date.today()

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()
    def __unicode__(self):
        return self.choice

Как видно из кода, каждый класс модели в обязательном порядке является наследником родительского класса models.Model, импортируемого из django.db.

По данным классам Django создаст необходимые таблицы в базе данных при выполнении команды syncdb. Но сперва информацию о них необходимо прописать в файле C:\django\mysite\settings.py в раздел INSTALLED_APPS.

12. Откройте файл C:\django\mysite\settings.py. Найдите раздел INSTALLED_APPS, в конец, котрого добавьте строку 'polls'.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'polls',
)

13. Теперь перейдите в консоль командной строки, введите

manage.py sql polls

и нажмите Enter для создания таблиц в базе данных на основе классов, описанных вами в файле C:\django\mysite\polls\models.py.



В результате в вашу базу данных будут добавлены новые таблицы.



14. Для проверки правильности внесенных изменений введите в консоли команду

manage.py validate



и нажмите Enter.

Если вы увидите надпись



то значит все работает правильно.

15. Выполните команду

manage.py syncdb

и нажмите Enter для создания таблиц Poll и Choice



16. Самое время наполнить таблицы базы данных для приложения polls содержимым. Введите в консоли

manage.py shell

и нажмите Enter для запуска Python из-под Django.



17. Далее вводите в консоль следующие команды для тренировки, каждый раз нажимая Enter после ввода очередной команды:

from polls.models import Poll, Choice
Poll.objects.all()
import datetime
p = Poll(question="What's up?", pub_date=datetime.datetime.now())
p.save()
p.id
p.question
p.pub_date
p.pub_date = datetime.datetime(2007, 4, 1, 0, 0)
p.save()
Poll.objects.all()

Poll.objects.filter(id=1)
Poll.objects.filter(question__startswith='What')
Poll.objects.get(pub_date__year=2007)
Poll.objects.get(id=2)
Poll.objects.get(pk=1)
p = Poll.objects.get(pk=1)
p.was_published_today()
p = Poll.objects.get(pk=1)
p.choice_set.all()
p.choice_set.create(choice='Not much', votes=0)
p.choice_set.create(choice='The sky', votes=0)
c = p.choice_set.create(choice='Just hacking again', votes=0)
c.poll
p.choice_set.all()
p.choice_set.count()
Choice.objects.filter(poll__pub_date__year=2007)
c = p.choice_set.filter(choice__startswith='Just hacking')
c.delete()

(

Те же команды, но в сокращенном виде. Только для создание записей в базе данных.

from polls.models import Poll, Choice
import datetime
p = Poll(question="What's up?", pub_date=datetime.datetime.now())
p.save()
p.pub_date = datetime.datetime(2007, 4, 1, 0, 0)
p.save()

p = Poll.objects.get(pk=1)
p.choice_set.create(choice='Not much', votes=0)
p.choice_set.create(choice='The sky', votes=0)

Эти команд создадут только необходимыме записи в базе данных.

)

18. Теперь активируем страницу для администраторов.
Откройте файл C:\django\mysite\settings.py и добавьте строку 'django.contrib.admin' в раздел INSTALLED_APPS.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
    'django.contrib.admin',
)

19. Выполните команду

manage.py syncdb

и нажмите Enter для создания таблиц в базе данных для страницы администраторов.





20. Далее откройте файл C:\django\mysite\urls.py и уберите комментарии со следующих строк:

from django.contrib import admin
admin.autodiscover()

и

url(r'^admin/', include(admin.site.urls))

20. Запустите сервер Django из командной строки, введя

manage.py runserver

и нажав Enter.



21. Откройте браузере и перейдите по ссылке

http://127.0.0.1:8000/admin/

В результате вы попадете на страницу ввода логина и пароля администратора.



22. В ячейку Username введите superuser, а в ячейку Password введите pass и нвжмите на кнопку Log in. Логин и пароль являются логином и паролем суперпользователя, которого вы создали на этапе формирования таблиц для базы данных.



В результате вы попадете на страницу для администраторов вашего сайта.



21. В данный момент приложение Poll пока еще не отображается в панели администраторов. Для того, чтобы оно там появилось создайте пустой файл файл под названием:

admin.py

Созданный вами файл admin.py поместите в папку вашего приложения polls.
Далее откройте файл admin.py и добавьте в него следующие строки:

from polls.models import Poll
from django.contrib import admin

admin.site.register(Poll)

Сохраните файл и перезапустите сервер, нажав в консоли командной строки
Ctrl + C и, введя manage.py runserver, нажмите Enter.



22. Перезагрузите страницу по адресу

http://127.0.0.1:8000/admin/

и обратите внимание, что в меню администрирования появился раздел Polls.



23. Нажмите на Polls и вы переместитесь на страницу со списком опросов.



В настоящее время в ней находится созданный нами ранее опрос.

24. Нажмите на What's up? для перехода на страницу редактирования опроса.



25. Теперь изменим форму в этом разделе. Откройте файл C:\django\mysite\polls\admin.py и замените в нем строку

admin.site.register(Poll)

на следующий код:

class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']

admin.site.register(Poll, PollAdmin)

В результате внесенных изменений порядок следования полей в форме автоматически поменяется.



26. Поля форм также можно разделять с помощью наоров полей fieldset.
Для этого внесите в файл C:\django\mysite\polls\admin.py следующие изменения:

from polls.models import Poll
from django.contrib import admin

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Poll, PollAdmin)

В результате выполнения данного кода поля будут разделены на наборы.



27. К полям формы можно добавить класс 'collapse', сворачивающий часть формы.

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]



28. Теперь добавим в форму поле Choise. Для этого добавим в файл C:\django\mysite\polls\admin.py следующие строки:

from polls.models import Choice

admin.site.register(Choice)

для того, чтобы вывести раздел Choices в меню.


29. Нажмите на пункт Choices и на следующей странице нажмите на кнопку Add choice.



В результате вы перейдете на страницу добавления новых записей для голосования.



На данной странице доступен только один вариант ответа при голосовании.

30. Добавим на эту страницу несколько полей для выбора разных вариантов ответов при голосовании. Для этого удалим из файла C:\django\mysite\polls\admin.py строку

admin.site.register(Choice)

и взамен добавим следующий код:

class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

В результате выполнения данного кода в форму будут добавлены новые поля.



Немного подправив код так:

class ChoiceInline(admin.TabularInline):

мы получим страницу такого вида:



31. Теперь перейдем на страницу пл адресу

http://127.0.0.1:8000/admin/polls/poll/



На данной странице информация выводится не полностью. Поэтому откроем файл C:\django\mysite\polls\admin.py и добавим в классы следующие изменения:

from polls.models import Poll
from polls.models import Choice
from django.contrib import admin

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ['question', 'pub_date', 'was_published_today']

admin.site.register(Poll, PollAdmin)

В результате на странице появятся новые поля.



32. Изменим заголовок Was published today на Published today?, добавив в файл  C:\django\mysite\polls\models.py следующие изменения:

from django.db import models
import datetime

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __unicode__(self):
        return self.question
       
    def was_published_today(self):
        return self.pub_date.date() == datetime.date.today()
    was_published_today.short_description = 'Published today?'  

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

    def __unicode__(self):
        return self.choice

В результате на странице http://127.0.0.1:8000/admin/polls/poll/ изменитися заголовок.



33. Отредактируем файл C:\django\mysite\polls\admin.py, чтобы добавить фильтры на страницу администрирования голосований Polls:

from polls.models import Poll
from polls.models import Choice
from django.contrib import admin

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ['question', 'pub_date', 'was_published_today']
    list_filter = ['pub_date']

admin.site.register(Poll, PollAdmin)
admin.site.register(Choice)


В результате на странице http://127.0.0.1:8000/admin/polls/poll/ появится раздел Filter.



34. В том же файле добавим возможность поиска:

from polls.models import Poll
from polls.models import Choice
from django.contrib import admin

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ['question', 'pub_date', 'was_published_today']
    list_filter = ['pub_date']
    search_fields = ['question']

admin.site.register(Poll, PollAdmin)
admin.site.register(Choice)



35. Также добавим сортировку по дате:

from polls.models import Poll
from polls.models import Choice
from django.contrib import admin

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ['question', 'pub_date', 'was_published_today']
    list_filter = ['pub_date']
    search_fields = ['question']
    date_hierarchy = 'pub_date'

admin.site.register(Poll, PollAdmin)
admin.site.register(Choice)




36. Теперь откройте файл C:\django\mysite\settings.py, найдите в нем раздел TEMPLATE_DIRS и измените его следующим образом:

TEMPLATE_DIRS = (
    'C:/django/mysite/templates',
)

Далее создайте папку templates в папке вашего сайта mysite. В папке templates создайте папку admin. В папку admin скопируйте файлы:

C:\Django-1.3\django\contrib\admin\templates\admin\base_site.html
C:\Django-1.3\django\contrib\admin\templates\admin\index.html

37. Далее поработаем с URL. Откройте файл C:\django\mysite\urls.py и замените в нем код на следующий:

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^polls/$', 'polls.views.index'),
    url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
    url(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
    url(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
    url(r'^admin/', include(admin.site.urls)),
)

Обратите внимание, что данные регулярные выражения не используют методы GET и POST.
Для примера, если запрос происходит к http://www.example.com/myapp/, то URLconf будет выглядеть как myapp/. Для запроса  http://www.example.com/myapp/?page=3, URLconf будет выглядеть так же myapp/.

38 Напишем наш первый View, который будет выводить страницу при переходе по адресу в браузере.

39. Сперва запустите сервер, набрав в консоли

manage.py runserver

и нажав Enter.



40. Теперь перейдите в браузере по адресу

http://127.0.0.1:8000/polls/

Вы увидите страницу с сообщением об ошибке.



Данная ошибка вызвана тем, что вы еще не написали View для этого адреса.

41. Напишем View для устранения ошибки. Откройте файл C:\django\mysite\polls\views.py и добавьте в него следующий код:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the poll index.")

Перейдите в браузеру по адресу

http://127.0.0.1:8000/polls/

и вы увидите работающую страницу.



42. Теперь добавим еще функции для отображения View страниц:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the poll index.")

def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)

В результате переход по ссылкам:

http://127.0.0.1:8000/polls/23/
http://127.0.0.1:8000/polls/23/results/
http://127.0.0.1:8000/polls/23/vote/

теперь будет приводить на работающие страницы.

43. Далее заставим наш View взаимодействовать с базой данных. Отредактируйте файл C:\django\mysite\polls\views.py, внеся в него следующие изменения:

from polls.models import Poll
from django.http import HttpResponse

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    output = ', '.join([p.question for p in latest_poll_list])
    return HttpResponse(output)


def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)

В результате на странице по адресу http://127.0.0.1:8000/polls/ будут выведены записи из базы данных.



44. Далее мы используем систему шаблонов Django для оформления вывода данных из базы данных. Отредактируйте файл C:\django\mysite\polls\views.py следующим образом:

from django.template import Context, loader
from polls.models import Poll
from django.http import HttpResponse

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    t = loader.get_template('polls/index.html')
    c = Context({'latest_poll_list': latest_poll_list,})
    return HttpResponse(t.render(c))


def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)

Выделенный код загрузит файл-шаблон C:\django\mysite\polls\index.html и подставит в него данные.

Давайте создадим шаблон. Перейдите в папку C:\django\mysite\templates и создате там папку polls. В папке C:\django\mysite\templates\polls создайте пустой файл index.html.

Обратите внимание, что код, загружающий шаблон loader.get_template('polls/index.html') на само деле загружает файл, расположенный по адресу [template_directory]/polls/index.html.

Откройте файл C:\django\mysite\templates\polls\index.html и добавьте в него следующий код:

{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

Откройте в браузере страницу по адресу http://127.0.0.1:8000/polls/ и вы увидите, что в результате выполнения данного кода записи из базы данных будут выведены в отформатированном виде в соответствии с файлом-шаблоном index.html.



45. Самый частый способ загрузки шаблона - это заполнить context и сделать return HttpResponse с результатом render шаблона. Поэтому в Django часто используется сокращенный вариант записи этого кода. Внесите в файл C:\django\mysite\polls\views.py следующие изменения:

from django.shortcuts import render_to_response
from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})


def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)

В результате по адресу http://127.0.0.1:8000/polls/ визуально ничего не изменится, но код будет работать другой.

46. Теперь добавим страницу с сообщением об ошибке 404. Внесите в файл C:\django\mysite\polls\views.py следующие изменения:

from django.http import Http404
from django.shortcuts import render_to_response
from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk =  poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_respone('polls/detail.html', {'poll': p})

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)

Перейдите в папку C:\django\mysite\templates\polls\ и создайте в ней пустой файл detail.html. Это файл будет использоваться в качестве шаблона для вывода информации из базы данных на страницу. Откройте файл C:\django\mysite\templates\polls\detail.html и добавьте в него следующий код:

{{ poll }}

Далее в браузере перейдите на страницу по адресу:

http://127.0.0.1:8000/polls/1/

чтобы убедиться, что все работает правильно.



Перейдите по адресу

http://127.0.0.1:8000/polls/23/

чтобы увидеть страницу с сообщением об ошибке 404.



47. Сокращенный вариант кода вывода страницы об ошибке 404 в файле C:\django\mysite\polls\views.py будет выглядеть так:

from django.shortcuts import render_to_response, get_object_or_404
from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})

def detail(request, poll_id):
    p = get_object_or_404(Poll, pk = poll_id)
    return render_to_response('polls/detail.html', {'poll': p})


def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)



Для вывода нескольких значений может использоваться функция get_list_or_404().

48. Теперь создадим свою собственную страницу с выводом сообщения об ошибке 404 взамен стандартной.
В папке C:\django\mysite\templates создайте файл 404.html. В файл вставьте следующую число:

404

Обратите внимание на то, что, если в файле C:\django\mysite\settings.py прописано DEBUG = True, то файл 404.html никогда не будет выведен на экран. Поэтому обязательно должно стоять DEBUG = False
В этом случае файл 404.html будет выведен только тогда, когда Django не найдет ни одно соответсвие регулярному выражению в файле C:\django\mysite\urls.py

Сохраните файл C:\django\mysite\templates\404.html и перейдите в браузере по адресу:

http://127.0.0.1:8000/polls/23/

В результате вы увидите страницу с сообщением об ошибке 404.



Похожим образом в папке C:\django\mysite\templates создайте файл 500.html.

49. Откройте файл C:\django\mysite\templates\polls\detail.html и замените в нем код на следующий:

<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice }}</li>
{% endfor %}
</ul>

50. При формировании УРЛ для сокращения работы вы можете использовать префиксы. Откройте файл C:\django\mysite\urls.py и внесите в него следующие изменения:

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('polls.view',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^polls/$', 'index'),
    url(r'^polls/(?P<poll_id>\d+)/$', 'detail'),
    url(r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
    url(r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
    url(r'^admin/', include(admin.site.urls)),

)

51. Вы можете также использовать несколько паттернов префиксов patterns().
Внесите в файл C:\django\mysite\urls.py следующие изменения:

 from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('polls.view',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^polls/$', 'index'),
    url(r'^polls/(?P<poll_id>\d+)/$', 'detail'),
    url(r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
    url(r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
    url(r'^admin/', include(admin.site.urls)),
)

urlpatterns += patterns('',
    url(r'^admin/', include(admin.site.urls)),
)


52. Теперь давайте перенесем формирование УРЛ в папку polls.
Скопируйте файл C:\django\mysite\urls.py в папку C:\django\mysite\polls.
Откройте файл C:\django\mysite\urls.py и внесите в него следующие изменения:

from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('polls.view',
    url(r'^polls/$', include('polls.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

Теперь откройте файл C:\django\mysite\polls\urls.py и внесите в него следующие поправки:

from django.conf.urls.defaults import patterns, include, url

urlpatterns = patterns('polls.view',
    url(r'^$', 'index'),
    url(r'^(?P<poll_id>\d+)/$', 'detail'),
    url(r'^(?P<poll_id>\d+)/results/$', 'results'),
    url(r'^(?P<poll_id>\d+)/vote/$', 'vote'),
)

53. Теперь обновим файл шаблона C:\django\mysite\templates\polls\detail.htm.
Измените коде следующим образом, добавив туда форму:

<h1>{{ poll.question }}</h1>

{% if error_message %}<p><strong>{{ error message }}</strong></p>{% endif %}

<form action="/polls/"{{ poll.id }}/vote" method="post">
{% csrf_token %}
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id}}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

Откройте файл C:\django\mysite\polls\views.py и внесите туда следующий код:

from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolves import reverse
from django.template import RequestContext

from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})

def detail(request, poll_id):
    p = get_object_or_404(Poll, pk = poll_id)
    return render_to_response('polls/detail.html', {'poll': p}), context_instance = RequestContext(request)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    p = get_object_or_404(Poll, pk = poll_id)
    try:
        selected_choice = p.choice_set.get(pk = request.POST['choice'])
    except(KeyError, Choice.DoesNotExist):
        return render_to_response('polls/detail.html', {
            'poll': p,
            'error_message': 'Toy didn't select a choice.',
        }, context_instance = RequestContext(request)
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls.views.results'), args = (p.id,))


def results(request, poll_id):
    p = get_object_or_404(Poll, pk = poll_id)
    return render_to_response('poll/results.html', {'poll': p})


Теперь создадим файл шаблон C:\django\mysite\templates\polls\results.html и добавим в него следующий код:

<h1>{{ poll.question }}</h1>

<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice }} -- {{ choice.votes }} vote {{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

<a href="/polls/{{ poll.id }}/">Vote again?</a>

Далее перейдите в браузере на страницу по адресу: http://127.0.0.1:8000/polls/1/

54. Теперь мы будем использовать generic views.
Откройте файл C:\django\mysite\polls\urls.py и внесите в него следующие изменения:

from django.conf.urls.defaults import *
from django.views.generic import DatilView, ListView
from polls.models import Poll

urlpatterns = patterns('',
    url(r'^$',
        ListView.as_view(
            queryset=Poll.objects.order_by('-pub_date')[:5],
            context_object_name='latest_poll_list',
            template_name='polls/index.html')),
    url(r'^(?P<pk>\d+)/$',
        DetailView.as_view(
            model=Poll,
            template_name='polls/detail.html')),
    url(r'^(?P<pk>\d+)/results/$',
        DetailView.as_view(
            model=Poll,
            template_name='polls/results.html'),
        name='poll_results'),
    url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
)

Теперь в файле C:\django\mysite\polls\views.py удалите index(), detail() и results(). В итоге код станет выглядеть так:

from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolves import reverse
from django.template import RequestContext
from polls.models import Poll

def vote(request, poll_id):
    p = get_object_or_404(Poll, pk = poll_id)
    try:
        selected_choice = p.choice_set.get(pk = request.POST['choice'])
    except(KeyError, Choice.DoesNotExist):
        return render_to_response('polls/detail.html', {
            'poll': p,
            'error_message': 'Toy didn't select a choice.',
        }, context_instance = RequestContext(request)
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))

def results(request, poll_id):
    p = get_object_or_404(Poll, pk = poll_id)
    return render_to_response('poll/results.html', {'poll': p})
Запустите сервер и перейдите в браузере по адресу http://127.0.0.1:8000/polls/1/

На этом обучение закончено.