На предыдущем шаге нами заданы структуры данных для хранения списка вопросов и вариантов ответов для них.
Пока мы еще ничего не сделали для того, чтобы иметь возможность работать с данными через сайт. Но 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
Входим в админку, используя указанные на первом шаге логин и пароль супер-пользователя.
Создание суперпользователя админки Django
Если по какой-то причине вы не создали суперпользователя раньше, то вы можете это сделать, выполнив консоли команду
python manage.py createsuperuser
Зайдя в админку, вы должны увидеть подобную картину:
Вы уже можете добавить пользователей для управления сайтом и группы, определяющие их права, а также изменить настройки сайта. Однако пока еще нельзя добавить или редактировать созданные нами модели Вопросов и Ответов.
Отображение объектов в админке Django — подключаем наши модели
Чтобы получить доступ к изменению объектов через админ. часть сайта, нужно зарегистрировать их в приложении admin.
Для этого:
Создайте новый файл в каталоге polls с названием admin.py. В файл вставьте следующий текст:
from django.contrib import admin from polls.models import Poll admin.site.register(Poll)
Теперь перезапустите сервер и обновите или зайдите заново в админку.
Порядок! Теперь нам доступно создание и редактирование новых вопросов через пункт Polls.
Django автоматически формирует веб-форму на базе модели, которая позволяет ввести все нужные данные. При этом еще не будет введено какое-то из полей, отмеченных как обязательное, форма вернет нас к редактированию подсветив нужные поля для ввода:
После заполнения всех полей и сохранения объекта, информация о нем сохраняется в базе данных.
Новый объект появился в списке, однако выглядит не очень информативно:
Дело в том, что для вывода информации об объекте 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 в админке используется текст, который мы ввели в качестве вопроса:
Добавление связанных объектов
Чтобы можно было добавить новые варианты ответов через админку, достаточно в файле admin.py добавить:
from polls.models import Choice admin.site.register(Choice)
Теперь “Choices” появилась в Django admin. При добавлении нового варианта ответа нужно будет выбрать соответствующий вопрос:
Однако это не очень удобно. В списке выбора вопроса будут все вопросы, которые были сохранены в базе. Кроме того, логично вводить варианты ответов при добавлении вопроса.
Давайте сделаем это.
В файле 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 варианта, а при необходимости добавить новые.
Единственный момент — класс admin.StackedInline выводит все поля друг под другом и этом занимает много места. В Django admin есть более подходящий класс TabularInline для табличного вывода полей.
class ChoiceInline(admin.TabularInline): #...
Дополнительную информацию по изменеию админки Django можно найти в статье http://itman.in/django-admin-changes/
А нам пора позаботиться о том, что будут отображать основные страницы нашего сайта. Переходим дальше.
Здравствуйте. После попытки добавить новый «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
«»»
К какому из этапов урока мне нужно вернуться?
Виталий, если вы описали модели в models.py, то возможно ві забыли добавить ваше приложение (в случае описанных уроков оно называется polls) в INSTALLED_APPS.
Посмотрите внимательно вывод выполнения команды
python manage.py syncdb
в http://itman.in/django-howto/#_Django-4
Если дело в этом — просто добавьте приложение в список и выполните
python manage.py syncdb повторно.
Чтобы лучше разобраться с работой Django с базами данных и как можно менять таблицы базы после ее создания — рекомендую прочесь http://itman.in/django-db-migration/.
Но это потом, на первом этапе лучше просто удалить базу и создать заново, пока все не будет получаться :)
Была такая же проблема. Оказалось, что начиная с какой-то версии (1.7 или 1.8) команда syncdb удалена, вместо нее необходимо использовать:
python manage.py makemigrations
python manage.py migrate
python manage.py makemigration
python manage.py migrate
Возникла та же проблема, что и у Виталия
OperationalError at /admin/polls/poll/add/
no such table: polls_poll
Не знаю в чём проблема, везде всё прописано и синхронизировано
Попробуй:
python manage.py makemigrations
python manage.py migrate
python manage.py syncdb
Потом restart server
У меня __unicode__ не заработал, пришлось заменить на __str__
Отредактировал файл urls.py как в статье.
После выполнения команды python manage.py runserver в консоли ошибка:
NameError: name ‘patterns’ is not defined