hodzanassredin ([info]hodzanassredin) wrote,
@ 2006-01-12 17:34:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Django часть 1 туториала

В этом туториале мы пройдем через создание простого Web
приложения для голосования.



Оно будет содержать две части:



  • Публичный сайт который позволит людям голосовать и просматривать результаты голосования.

  • Администраторский сайт который позволит вам добавлять, изменять, и удалять голосования.


Мы подразумеваем что у вас установлен Django .



Начальная настройка


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


Запустите команду django-admin.py startproject myproject. Это создаст
myproject директорию в вашем текущем каталоге.


(django-admin.py должен быть путях поиска, если вы устанавливаете Django
через setup.py утилиту. Если он не в путях поиска , Вы можете найти его в
site-packages/django/bin; создайте символическую ссылку на него где нибудь
в ваших путях поиска, таких как /usr/local/bin.)



Где будет жить этот код?


Если вы пришли из PHP,вы возможно используете для вашего кода место внутри корня документов Web сервера (В месте типа /var/www). С Django,
вы не делаете этого. Это плохая идея класть Python код внутрь корня документов Web сервера, потому, что это вызывает возможность доступа к вашему коду через Web.
Это не очень хорошо для безопастности.


Положите ваш код в какуюнибудь директорию снаружи корня документов, такую как
/home/mycode.



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


myproject/
    __init__.py
    manage.py
    settings.py
    urls.py

Эти файлы:




  • manage.py: Утилита командной строки которая позволяет взаимодействовать с этим Django проектом различными путями.

  • settings.py: Настройки/конфигурация для этого проекта Django .

  • urls.py: Декларации URL для этого Django проекта; "таблица содержания" вашего Django-сайта.




Сервер разработки


Перейдите в myproject директорию, Если вы еще не там,и запустите
команду python manage.py runserver. Вы увидете следующий вывод в командную строку:


Validating models...
0 errors found.

Starting server on port 8000 with settings module 'myproject.settings'.
Go to http://127.0.0.1:8000/ for Django.
Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows).

(Если вы получили ошибку о DATABASE_ENGINE, отредактируйте ваш settings.py файл
для изменения DATABASE_ENGINE настроек указывающих на корректную базу данных, и
убедитесь что вы имеете правильно установленные библиотеки доступа к базам данных -- таких как PostgreSQL'овский
psycopg или MySQL'овский MySQLdb.)


Вы запустили Django сервер разработчика, легкий, чистый-Python Web
сервер который построен на BaseHTTPServer включенный в Python'вскую стандартную библиотеку.
Мы включили его в Django так, что вы можете разрабатывать быстро, без возни с настройкой Apache, до тех пор пока вы не выпустите конечный продукт.


НЕ ИСПОЛЬЗУЙТЕ этот сервер в каких-нибудь законченных решениях. Он может быть использован только для разработки.



Изменяем порт


По умолчанию, runserver комманда стартует сервер на 8000 порту. Если вы хотите изменить порт сервера, наберите его как аргумент командной строки:


python manage.py runserver 8080


Теперь когда сервер запущен, посетите http://127.0.0.1:8000/ вашим Web
браузером. Вы увидите "Welcome to Django" страницу, в приятном, светло голубом цвете.
Работает!




Настройка базы данных


Теперь отредактируйте settings.py. Это простой модуль Python с переменными module-уровня
переназначавшие настройки Django . Измените эти настройки для совпадения с вашими параметрами подключения к базе данных:




  • DATABASE_ENGINE -- Любой из 'postgresql', 'mysql' или 'sqlite3'.
    Скоро будет больше.

  • DATABASE_NAME -- Имя вашей базы данных, в полном (абсолютном)
    пути к файлу БД если вы используете SQLite.

  • DATABASE_USER -- Имя пользователя БД (не используется для SQLite).

  • DATABASE_PASSWORD -- Пароль БД (не используется для SQLite).

  • DATABASE_HOST -- Адрес вашей БД. Оставьте его пустым если ваш сервер БД на той же физической машине (не используется для SQLite).




Заметка


Убедитесь что вы создали БД в PostgreSQL или MySQL .Если нет то сделайте это так "CREATE DATABASE database_name;" внутри интерактивного приглашения вашего сервера БД.



Запустите следующую команду для инициализации вашей БД с таблицами БД ядра Django':


python manage.py init

Если вы не видете каких-нибудь ошибок, значит оно работает.


Если вам интересно , запустите клиента командной строки для вашей БД и наберите \dt (PostgreSQL), SHOW TABLES; (MySQL), или .schema (SQLite) для вывода созданных Django таблиц.



О этих таблицах БД


Таблицы созданные manage.py init для сессий, аутентификации
и других фич предлагаемых Django . Следующий релиз Django будет иметь
"легкую" версию init команды без установки таблиц БД если вам они без нужды..






Создание моделей


Теперь ваше окружение -- "проект" -- настроен, все готово для того чтобы работать. (Вам больше не придется беспокоится об администрировании снова.)


Каждое приложение которое вы пишете в Django Python пакете, где-нибудь в вашем Python путе, что следует определенному соглашению . Django идет с утилитой которая автоматически генерирует базовую структуру директорий приложения,
так,что вы можете сфокусироваться на написании кода а не на создании директорий.



Проекты против приложений


Какая разница между проектом и приложением ? Приложение является Web
приложением которое, что то делает --например система блогов, БД публичных записей или простое приложение голосования. Проект является коллекцией
настроек и приложений в частности Web сайт. Проект может содержать много приложений. Одно приложение может быть во многих проектах.



В этом учебнике , мы создадим наше приложение голосования в каталоге myproject ,
для простоты. В результате , приложение будет связанно с проектом, Python код внутри poll приложения будет ссылать к myproject.polls.
Позже в этом обучении , мы обсудим выделение вашего приложения для распространения.


Для создания вашего приложения, убедитесь что вы в myproject директории и наберите
эту команду:


python manage.py startapp polls

Это создаст каталог polls, который выглядит подобно этому:


polls/
    __init__.py
    models/
        __init__.py
        polls.py
    views.py

Эта структура каталогов будет домом для приложения голосования.


Первый шаг написание БД Web приложения в Django состоит из определения ваших моделей -- по существу, топология вашей БД, с дополнительными метаданными.



Философия


Модель едина, определенный источник данных. Она содержит важнейшие поля и поведение хранимых данных. Django следует DRY принципу. Главное это определить модель ваших данных в одном месте и автоматически получать различные вещи из нее.



В нашем простом приложении голосования, мы создадим две модели: голосования и выборы. Голосование включает вопрос и дату публикации. Выбор имеет два поля текст выбора и количество голосов. Каждый выбор ассоциирован с голосованием.


Эти концепции представлены простыми Python классами. Отредактируем
polls/models/polls.py файл так чтобы он выглядел так:


from django.core import meta

class Poll(meta.Model):
    question = meta.CharField(maxlength=200)
    pub_date = meta.DateTimeField('date published')

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

Код простой. Каждая модель представлена классом который является подклассом django.core.meta.Model. Каждая модель имеет переменные, каждая из которых представляет поле БД в модели.


Каждое поле представлено экземпляром meta.*Field класса -- например.,
meta.CharField для символьных полей и meta.DateTimeField для
даты-времени. Это говорит Django что тип данных каждого поля определен.


Имя каждого meta.*Field экземпляра (например. question или pub_date )
являются именами полей, в формате дружественном машине . Вы будете использовать эти пременые в вашем коде Python , и ваша БД будет использовать их ка имя колонки.


Вы можете опционально использовать аргумент первой позиции для Field обозначения читаемого человеком имени. Это используется в некоторых внутренних частях Django, и это дублируется ка документация. Если это поле готово, Django будет использовать машинное имя. В этом примера, мы имеем только человеческие имена для Poll.pub_date. Для всех других полей в этих моделях, поля с машинными именами будут удовлетворять человеческим именам.(Ну и бредово я перевожу :-) )


Некоторые meta.*Field классы имеют обязательные элементы. meta.CharField,для примера , необходимо чтоб вы дали его максимальную длину. Это используется не только в схеме БД
, но и в проверках, как мы вскоре увидим.


В окончание, отметим связь определена, используя meta.ForeignKey. Это говорит Django каждый Choice(Выбор) связан с одним Poll(Голосованием). Django поддерживает все возможные связи БД один к одному, многие ко многим и один к одному.




Активация моделей


Зтот маленький кусок кода модели дает Django много информации. С помощью ее, Django
может:




  • Создать схему БД (CREATE TABLE ) для этого приложения.

  • Создать с помощью Python БД API доступ к Poll(Голосование) и Choice(Выбор) объектам.



Но в начале нам нужно сообщить нашему проекту, что приложение Голосования установлено.



Философия


Django приложения являются "pluggable": Вы можете использовать приложение во многих проектах, и
вы можете распространять приложения, потому, что они не завязаны на данную
Django инсталляцию.



Отредактируйте settings.py файл снова, и измените INSTALLED_APPS секцию
так чтобы включить строку 'myproject.polls'. Примерно так:


INSTALLED_APPS = (
    'myproject.polls',
)

Не забудьте про заключительную запятую, потому, что это Python' правило об tuple-ах с одним элементом: Без этой запятой, Python не поймет что это tuple.)


Теперь Django знает myproject включает приложение.голосования. Давайте запустим другою команду:


python manage.py sql polls

Вы увидите следующее ( CREATE TABLE SQL выражения для приложения голосования):


BEGIN;
CREATE TABLE "polls_polls" (
    "id" serial NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
CREATE TABLE "polls_choices" (
    "id" serial NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_polls" ("id"),
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
COMMIT;

Отметим следующее:




  • Имена таблиц автоматически генерируются комбинированием имени приложения
    (polls) с множественной версией имени объекта (polls и choices).
    (Вы можете переопределить это поведение.)

  • Первичные ключи (ID) добавляются автоматически. (Вы можете переопределить это тоже.)

  • Django добавляет "_id" в имя поля внешнего ключа , по соглашению.
    Да,вы можете переопределить это также.

  • Отношение внешнего ключа создан явно выражением REFERENCES .

  • Это специализировано к БД которую вы используете, такие БД-специфичные типы полей таких как авто инкремент (MySQL), последовательный (PostgreSQL), или
    целый первичный ключ (SQLite) управляются для вас автоматически. Таким же образом
    имена полей берутся в кавычки --например., используются двойные кавычки или одиночные
    кавычки. Автор этого туториала использует PostgreSQL, так выход примера в синтаксисе PostgreSQL .



Если вы интересуетесь, также запустите следующие команды:




  • python manage.py sqlinitialdata polls -- Выводит начальные данные необходимые административной части Django фреймворка.

  • python manage.py sqlclear polls -- Выводит необходимые DROP
    TABLE
    выражения для этого приложения, для каждой из таблиц которые уже существуют в вашей БД .

  • python manage.py sqlindexes polls -- Выводит CREATE INDEX
    выражения для этого приложения.

  • python manage.py sqlall polls -- Комбинация 'sql' и
    'sqlinitialdata'.



Рассматривание вывода этих команд может помочь вам понять, что действительно случилось.


Сейчас запустим команду для создания таблиц БД автоматически для нашего приложения :


python manage.py install polls

Эта команда берет вывод
python manage.py sqlall polls и выполняет его в БД на которую ссылается ваш Django файл настрое.


Прочитайте django-admin.py документацию для полной информации о том, что
manage.py утилита может делать.




Играем с API


Тепреь, перейдем в интерактивную среду Python и поиграем с API Django. Для входа в оболочку Python, используйте команду:


python manage.py shell

Мы используем это взамен набора "python", потомучто manage.py устанавливает
свойства окружения проекта для вас. "Установка окружения" касается двух вещей :




  • Кладет myproject в sys.path. Для гибкого, нескольких кусочков Django обращений к проектам в Python-овском точка-путь нотации (например.
    'myproject.polls.models'). В результате этой работы,
    myproject пакет будет внутри sys.path.


    Мы уже видели один пример этого : INSTALLED_APPS настройки списка пакетов в нотации точечного-пути.



  • Настройка DJANGO_SETTINGS_MODULE переменной окружения, которая дает
    Django путь к вашему settings.py файлу.






Обход manage.py


Если вы не желаете использовать manage.py, нет проблем. Только убедитесь в том, что
myprojectнаходится в корневом уровне пути Python (то есть
import myproject работает) и установите DJANGO_SETTINGS_MODULE
переменную окружения равнойmyproject.settings.


Для более подробной информации обо всем этом, смотрите django-admin.py документацию.



Теперь когда вы в оболочке , исследуем БД API:


# Модули динамически созданы в  django.моделях.
# Их имена  множественная версия имени класса модели.
>>> from django.models.polls import polls, choices

# В системе еще нет голосований
>>> polls.get_list()
[]

# Создадим новое  Poll(Голосование).
>>> from datetime import datetime
>>> p = polls.Poll(question="What's up?", pub_date=datetime.now())

# Сохраним объект в БД. Вы должны вызвать  save() .
>>> p.save()

# Теперь оно имеет  ID. Отметим что это может сказать "1L" вместо "1", в зависимости от того 
# какую БД вы используете. Это не ошибка; это только значит что ваша БД возвращает целое как
#  объект Python длинное целое

>>> p.id
1

# Доступ к колонкам БД через атрибуты  Python .
>>> p.question
"What's up?"
>>> p.pub_date
datetime.datetime(2005, 7, 15, 12, 00, 53)

# Изменим значения изменяя атрибуты, потом вызовем save().
>>> p.pub_date = datetime(2005, 4, 1, 0, 0)
>>> p.save()

# get_list() показывает все голосования в БД.
>>> polls.get_list()
[<Poll object>]

Подождите минуту. <Poll(Голосование) object> есть, очень, бесполезное представлением этого объекта . Давайте изменим это редактированием модели голосования (в polls/models/polls.py файле) и добавим __repr__() метод в
обе модели Poll и Choice:


class Poll(meta.Model):
    # ...
    def __repr__(self):
        return self.question

class Choice(meta.Model):
    # ...
    def __repr__(self):
        return self.choice

Это важно добавить __repr__() методы в ваши модели, не только для вашего собственного
ума в общении с интерактивной подсказкой, на также потомучто объекты'
представление используется через Django автоматически генерируемую административную страницу.


Отметим что это нормальные Python методы. Давайте добавим собственный метод, только для демонстрации:


class Poll(meta.Model):
    # ...
    def was_published_today(self):
        return self.pub_date.date() == datetime.date.today()

Отметим, что вimport datetime нет нужды. Каждый метод модели имеет доступ к большинству обычно используемых переменных для удобства, включая
datetime модуль стандартной библиотеки Python.


Давайте вернемся в интерактивную оболочку Python запустив
python manage.py оболочку снова:


>>> from django.models.polls import polls, choices
# Убедимся, что  __repr__() добавление работает.
>>> polls.get_list()
[What's up?]

# Django предлагает богатый API поиска в БД  который всецело управляема
# аргументами ключевых слов.
>>> polls.get_object(id__exact=1)
What's up?
>>> polls.get_object(question__startswith='What')
What's up?
>>> polls.get_object(pub_date__year=2005)
What's up?
>>> polls.get_object(id__exact=2)
Traceback (most recent call last):
    ...
PollDoesNotExist: Poll does not exist for {'id__exact': 2}
>>> polls.get_list(question__startswith='What')
[What's up?]

# Поиск по первичному ключу наиболее общий случай, так Django предлагает 
# команду для правильного поиска по первичному-ключу .
# Следующее идентично polls.get_object(id__exact=1).
>>> polls.get_object(pk=1)
What's up?

# Убедимся что наш собственный метод работает.
>>> p = polls.get_object(pk=1)
>>> p.was_published_today()
False

# Дадим  Poll(Голосованию) немного  Choices(Выборов). Каждый вызов этого метода делает
# INSERT выражение и возвращает новый объект Choice .
>>> p = polls.get_object(pk=1)
>>> p.add_choice(choice='Not much', votes=0)
Not much
>>> p.add_choice(choice='The sky', votes=0)
The sky
>>> c = p.add_choice(choice='Just hacking again', votes=0)

# Choice объекты имеют API для доступа к их связанным  Poll объектам.
>>> c.get_poll()
What's up?

# И с другой стороны : Poll объекты имеют доступ к  Choice объектам.
>>> p.get_choice_list()
[Not much, The sky, Just hacking again]
>>> p.get_choice_count()
3

# API автоматически следует связям настолько насколько вам это необходимо.
# Используем двойное подчеркивание для разделения связей.
# Это работает на столько уровней вглубь насколько вы захотите. Здесь нет предела.
# Найдем все  Choices для любого голосования чья дата публикации в  2005 году.
>>> choices.get_list(poll__pub_date__year=2005)
[Not much, The sky, Just hacking again]

# Давайте удалим один из выборов. Используйте delete() для этого.
>>> c = p.get_choice(choice__startswith='Just hacking')
>>> c.delete()

Для деталей БД API, смотрите наш БД API описание.


Когда вы поймете API, читайте часть 2 этого туториала для того чтобы узнать как работает Django' автоматическое администрирование.





(Post a new comment)


[info]_winnie
2006-01-12 02:44 pm UTC (link)
CUT! CUT! CUT! CUT! CUT! CUT! CUT! CUT! CUT! CUT! CUT!
LJ-CUT! LJ-CUT! LJ-CUT! LJ-CUT! LJ-CUT! LJ-CUT! LJ-CUT! LJ-CUT! LJ-CUT!

Аффтар, юзай lj-cut!

</lj-cut> МНОГО МНОГО МНОГО МНОГО МНОГО МНОГО МНОГО МНОГО текста </lj-cut>

(Reply to this) (Thread)


[info]hodzanassredin
2006-01-13 05:13 am UTC (link)
Юзаю см посты ниже. Просто вчера не успел доделать пришлось срочно уходить. Седня все переведу и доделаю в кат

(Reply to this) (Parent)

Мои 2.5 копейки
[info]dp_wiz
2006-01-20 09:26 am UTC (link)
http://aenor.ru/wiz/django/tutorial1
http://aenor.ru/wiz/django/tutorial2
http://aenor.ru/wiz/django/tutorial3

(Reply to this) (Thread)

Re: Мои 2.5 копейки
(Anonymous)
2006-03-18 03:54 pm UTC (link)
404 однако. А хтелось бы почитать

(Reply to this) (Parent)(Thread)

Re: Мои 2.5 копейки
[info]dp_wiz
2006-03-18 05:07 pm UTC (link)
не 404, а $$$
):

в ближайшее время постараюсь что-нибудь придумать... Хотя всёравно там уже изрядно подустарело...

(Reply to this) (Parent)

Re: Мои 2.5 копейки
[info]hodzanassredin
2006-01-20 11:27 am UTC (link)
Да я уже знаю Обломался я :-) Но вот что 3 часть вышла не знал Сенкс

(Reply to this)


[info]kebba
2007-04-03 01:24 pm UTC (link)
Спасибо большое за ваш труд.
Хотя API немного поменялся (для текущей 0.96), все-равно очень помогло.

(Reply to this) (Thread)


[info]hodzanassredin
2007-04-03 04:43 pm UTC (link)
Ну вот меня первый раз кто то похвалил за перевод. :-) На выходных выпью бутылочку пива.

(Reply to this) (Parent)


Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…