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

Опрос (ч.3.1)

В части 2 мы сгенерировали таблицы для нашего приложения в базе данных. В этой части мы настроим админку для использования нашего приложения "Опросы".


Этап 5. Настройка админки

1. Зарегистрируем модель Question в админке. Для этого отредактируем файл polls/admin.py:
# -*- coding:utf-8 -*-
from django.contrib import admin
from .models import Question

admin.site.register(Question)

Здесь мы импортируем только модель Question. Модель Answer импортировать не нужно, т.к. она связана с Question через внешний ключ.

Внимание: при импорте модели Question мы не указываем имя приложения polls:
from .models import Question
Это позволяет нам не привязываться к названию приложения. Мы просто импортируем модель Question из файла models.py, который лежит в той же папке, что и файл admin.py.

2. Запустим сервер разработки, выполнив в консоли cmd.exe команду:
python manage.py runserver

По умолчанию, сервер будет запущен по адресу: http://127.0.0.1:8000/

3. Проверьте работу админки: http://127.0.0.1:8000/admin/
У вас получится следующее:

Внешний вид аминки

Нажмите на пункт Вопросы, на открывшейся странице в правом верхнем углу нажмите Добавить вопрос и создайте вопрос для голосования, нажав Сохранить:

Создание вопроса для голосования

4. Поменяем порядок полей в админке Django. Для этого скорректируем файл polls/admin.py:
# -*- coding:utf-8 -*-
from django.contrib import admin
from .models import Question

class QuestionAdmin(admin.ModelAdmin):
    fields = ['is_active', 'date_published', 'title']

admin.site.register(Question, QuestionAdmin)

Смысл состоит в создании класса с настройками, который передается в качестве второго параметра в функцию admin.site.register(). 
Поля поменялись местами:

Поля поменялись местами

5. Добавим филдсеты (fieldsets) – группы полей. Для групп полей, которые редко используются, можно предусмотреть, чтобы они по умолчанию были в свернутом состоянии - при помощи 'classes': ['collapse']. Отредактируем файл polls/admin.py:

# -*- coding:utf-8 -*-
from django.contrib import admin
from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, 
            {'fields': ['title', 'is_active']}
        ),
        ('Информация о дате',
            {'fields': ['date_published'], 
            'classes': ['collapse']}
        ),
    ]

admin.site.register(Question, QuestionAdmin)

Указание в качестве свойства класса collapse позволяет отображать филдсет свернутым:

Филдсет свернут

6. Будет удобно, если варианты ответа можно будет добавить на той же странице, что и вопрос опроса. Благо, что фреймворк Django легко позволяет это реализовать. Отредактируем файл polls/admin.py:

# -*- coding:utf-8 -*-
from django.contrib import admin
from .models import Question, Answer


class AnswerInline(admin.StackedInline):
    model = Answer
    extra = 2


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, 
            {'fields': ['title', 'is_active']}
        ),
        ('Информация о дате',
            {'fields': ['date_published'], 
            'classes': ['collapse']}
        ),
    ]
    inlines = [AnswerInline]


admin.site.register(Question, QuestionAdmin)

Теперь мы можем редактировать ответы на странице создания вопроса для голосования. В классе настроек AnswerInline (имя может быть любым) указана используемая модель Answer и число ответов по умолчанию extra = 2.


Ответы на странице создания вопроса


Однако удобнее, если ответы и голоса располагаются в одну линию. Для этого нужно поправить файл polls/admin.py:
class AnswerInline(admin.TabularInline):
    #...

Как видно, мы заменили admin.StackedInline на admin.TabularInline. Вот результат:

Расположение ответов TabularInline

7. По умолчанию Django отображает для каждой модели то, что возвращает функция __unicode__(self), расположенная в каждом классе модели. Так, например, в модели Question эта функция возвращает self.title. Поэтому по умолчанию отображается только поле title (в модели Question мы присвоили полю название "Вопрос"):

Поле Вопрос

Пусть еще отображается дата публикации опроса и его активность (неактивный опрос на сайте отображать не будем). Для этого нужно поправить файл polls/admin.py:

class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('title', 'date_published', 'is_active')

Поля Вопрос, Дата публикации, Опубликован


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

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

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