Начинаем работу с Django — подключение админки

На предыдущем шаге нами заданы структуры данных для хранения списка вопросов и вариантов ответов для них.

Пока мы еще ничего не сделали для того, чтобы иметь возможность работать с данными через сайт. Но Django предосставляет нам мощную систему администрирования для управления данными нашего сайта прямо из коробки. Админка Django не предназначена для обычных посетителей сайта. Скорее это средство, упрощающее для администратора работу с данными. Django автоматически создает интерфейс для управления нашими данными на базе созданных нами моделей также, как создает соотвествующие им таблицы в базе данных.

Включение админки Django

Чтобы начать использовать админку сайта, предоставляемую Django, нужно предварительно выполенить несколько действий.

Во-первых, в файле настроек проекта settings.py нужно раскоментировать строку django.contrib.admin

Теперь нам снова нужно выполнить команду

python manage.py syncdb

Django создаст в базе данных таблицы, которые необходимы для работы админской части сайта.

Creating tables ...
Creating table django_admin_log
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Теперь нужно отредактировать файл mysite/urls.py, чтобы сообщить Dajngo, какой код нужно вызвать, когда мы обратимся через браузер к админке.

Для этого раскоментируем нужные строки. Теперь файл mysite/urls.py должен выглядеть так:

from django.conf.urls 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'^$', '{{ project_name }}.views.home', name='home'),
    # url(r'^{{ project_name }}/', include('{{ project_name }}.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'^admin/', include(admin.site.urls)),
)

Строки, которые нужно раскоментировать, подсвечены жирным шрифтом.

Для запуска нашего сайта выполним команду

python manage.py runserver

В консоли вы должны увидеть

Validating models...

0 errors found
June 10, 2013 - 15:23:00
Django version 1.5.1, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Это означает, что все в порядке, и мы можем начинать работу с сайтом. Но вместо http://127.0.0.1:8000/ откроем http://127.0.0.1:8000/admin/

Вы должны увидеть приглашение ввести логин и пароль для входа в админку Django
Log in | Django site admin

Входим в админку, используя указанные на первом шаге логин и пароль супер-пользователя.

Создание суперпользователя админки Django

Если по какой-то причине вы не создали суперпользователя раньше, то вы можете это сделать, выполнив консоли команду

python manage.py createsuperuser

Зайдя в админку, вы должны увидеть подобную картину:

Django site admin

Вы уже можете добавить пользователей для управления сайтом и группы, определяющие их права, а также изменить настройки сайта. Однако пока еще нельзя добавить или редактировать созданные нами модели Вопросов и Ответов.

Отображение объектов в админке Django — подключаем наши модели

Чтобы получить доступ к изменению объектов через админ. часть сайта, нужно зарегистрировать их в приложении admin.

Для этого:

Создайте новый файл в каталоге polls с названием admin.py. В файл вставьте следующий текст:

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

admin.site.register(Poll)

Теперь перезапустите сервер и обновите или зайдите заново в админку.

Django Site administration - добавляем наши модели

Порядок! Теперь нам доступно создание и редактирование новых вопросов через пункт Polls.

Django site admin - добавляем новый объект

Django автоматически формирует веб-форму на базе модели, которая позволяет ввести все нужные данные. При этом еще не будет введено какое-то из полей, отмеченных как обязательное, форма вернет нас к редактированию подсветив нужные поля для ввода:

Django site admin - проверка введенных данных

После заполнения всех полей и сохранения объекта, информация о нем сохраняется в базе данных.

Новый объект появился в списке, однако выглядит не очень информативно:

Django site admin - список объектов

 

Дело в том, что для вывода информации об объекте Django использует метод __unicode__(). В созданном нами классе Poll нет такого метода. Добавим его.

Добавление названия объектам

Для вывода информативного названия объекта, добавим метод __unicode__() к классам Poll и Choice.

Отредактируем models.py, добавив выделенный жирным текст:

class Poll(models.Model):
    # ...
    def __unicode__(self):
        return self.question

class Choice(models.Model):
    # ...
    def __unicode__(self):
        return self.choice_text

Теперь после обновления списка объектов Poll в админке используется текст, который мы ввели в качестве вопроса:

Django site admin - список объектов

Добавление связанных объектов

Чтобы можно было добавить новые варианты ответов через админку, достаточно в файле admin.py добавить:

from polls.models import Choice

admin.site.register(Choice)

Теперь “Choices” появилась в Django admin. При добавлении нового варианта ответа нужно будет выбрать соответствующий вопрос:

Choice admin page

Однако это не очень удобно. В списке выбора вопроса будут все вопросы, которые были сохранены в базе. Кроме того, логично вводить варианты ответов при добавлении вопроса.

Давайте сделаем это.

В файле admin.py уберем register() для класса Choice и отредактируем регистрацию класса Poll. Измените текст на приведенный ниже.

from django.contrib import admin

from polls.models import Poll, Choice

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

class PollAdmin(admin.ModelAdmin):
    inlines = [ChoiceInline]

admin.site.register(Poll, PollAdmin)

Теперь объекты Choice могут быть добавлены сразу при добавлении вопроса, при этом Django предложит заполнить сразу 3 варианта, а при необходимости добавить новые.

Additional slot added dynamically

Единственный момент — класс admin.StackedInline выводит все поля друг под другом и этом занимает много места. В Django admin есть более подходящий класс TabularInline для табличного вывода полей.

class ChoiceInline(admin.TabularInline):
    #...

Дополнительную информацию по изменеию админки Django можно найти в статье http://itman.in/django-admin-changes/

А нам пора позаботиться о том, что будут отображать основные страницы нашего сайта. Переходим дальше.

Начинаем работу с Django — подключение админки: 9 комментариев

  1. Здравствуйте. После попытки добавить новый «poll» в админке — получаю ошибку:
    «»»
    no such table: polls_poll

    Request Method: POST
    Request URL: http://127.0.0.1:8000/admin/polls/poll/add/
    Django Version: 1.8.4
    Exception Type: OperationalError
    Exception Value:
    no such table: polls_poll
    «»»
    К какому из этапов урока мне нужно вернуться?

    1. Виталий, если вы описали модели в models.py, то возможно ві забыли добавить ваше приложение (в случае описанных уроков оно называется polls) в INSTALLED_APPS.

      Посмотрите внимательно вывод выполнения команды
      python manage.py syncdb
      в http://itman.in/django-howto/#_Django-4

      Если дело в этом — просто добавьте приложение в список и выполните
      python manage.py syncdb повторно.

    2. Чтобы лучше разобраться с работой Django с базами данных и как можно менять таблицы базы после ее создания — рекомендую прочесь http://itman.in/django-db-migration/.

      Но это потом, на первом этапе лучше просто удалить базу и создать заново, пока все не будет получаться :)

    3. Была такая же проблема. Оказалось, что начиная с какой-то версии (1.7 или 1.8) команда syncdb удалена, вместо нее необходимо использовать:
      python manage.py makemigrations
      python manage.py migrate

  2. Возникла та же проблема, что и у Виталия

    OperationalError at /admin/polls/poll/add/
    no such table: polls_poll

    Не знаю в чём проблема, везде всё прописано и синхронизировано

  3. Отредактировал файл urls.py как в статье.
    После выполнения команды python manage.py runserver в консоли ошибка:
    NameError: name ‘patterns’ is not defined

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *