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

Опрос (ч.4)

В части 3.2 мы ознакомились с основными возможностями, которые нам дает админка Django. В этой части мы отобразим список последних двух свежих опросов, который будет доступен пользователям сайта.
1. Отредактируем файл роутов нашего проекта - firstsite/urls.py:

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

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

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

    # Приложение Опросы
    url(r'^polls/', include('polls.urls', namespace="polls") ),
)

Здесь мы делаем подключение роутов приложения polls, если пользователь переходит по адресу http://127.0.0.1:8000/polls .
Параметр namespace="polls" мы используем, чтобы впоследствии использовать неймспейсы в шаблонах.

2. Создадим файл роутов нашего приложения: polls/urls.py:
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from .views import *

urlpatterns = patterns('',

    url(r'^$', IndexView.as_view(), name='index'),
)

Данный роут означает, что если пользователь перейдет по адресу http://127.0.0.1:8000/polls/ , то будет задействовано представление IndexView. Это так называемое class based view представление, т.е. представление, основанное на классах.

3. Создадим представление IndexView главной страницы в polls/views.py:
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.views.generic import ListView, DetailView
from .models import Question, Answer

class IndexView(ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_questions_list'

    def get_queryset(self):
        """Вернуть 2 последних свежих опроса"""
        return Question.objects.order_by('-date_published')[:2]

Обратите внимание:
template_name = 'polls/index.html' - мы не стали писать просто 'index.html', т.к. в других приложениях тоже может быть шаблон с таким именем. Можно считать что 'polls/...' здесь своего рода неймспейс.
context_object_name = 'latest_questions_list' - именно такое название в шаблоне будет иметь переменная с данными.

4. Шаблон, используемый представлением IndexView относится к приложению, а не проекту. Поэтому разумно поместить этот шаблон в приложение. Создадим шаблон по адресу polls/templates/polls/index.html:

<h1>Последние опросы</h1>
{% if latest_questions_list %}
    <ul>
        {% for question in latest_questions_list %}
            <li>{{ question.title }}</li>
        {% endfor %}
    </ul>
{% else %}
    <p>Опросы не найдены.</p>
{% endif %}


Перейдите по адресу, чтобы посмотреть результат:  http://127.0.0.1:8000/polls/

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

2 комментария:

  1. Здравствуйте! Спасибо за труды. А как оптимизировать этот код для случая, когда опрос и его результаты встроены в одну страницу, и не имеют собственных url?
    Спасибо!

    ОтветитьУдалить
    Ответы
    1. Если я правильно понял, то вам нужно, чтобы текст опроса и его результаты располагались на одной странице. В таком случае текст опроса можно получить, перейдя по адресу /polls/3
      А как отобразить на странице с таким url еще и результаты опроса - тема отдельного разговора. Это не так просто. Возможно вам удастся найти решение, и вы с нами им поделитесь.

      Удалить