Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

Django

Это перевод официальной документации , которая лежит тут

1. Краткий обзор

Джанго - питоновский фреймворк для написания веб-приложений , ориентированных на базы данных. База данных описывается в стиле ООП.

Пример создания обьекта базы данных:

     class Reporter(models.Model):
         full_name = models.CharField(max_length=70)
 
Для создания таблицы в реальной базе данных выполним команду :
     manage.py syncdb
 
После этого можно из командной питоновской строки управлять базой данных :
 # проверим записи в таблице репортеров :
 >>> Reporter.objects.all()
 []
 # создадим новый Reporter.
 >>> r = Reporter(full_name='John Smith')
 
 # запишем его в базу
 >>> r.save()
 
 # получим его ID.
 >>> r.id
 1
 
 # поле из записи
 >>> r.full_name
 'John Smith'
 
 # Django имеет продвинутое встроенное API для работы с БД
 >>> Reporter.objects.get(id=1)
 
 >>> Reporter.objects.get(full_name__startswith='John')
 
 >>> Reporter.objects.get(full_name__contains='mith')
 
 
 
После создания модели джанго может автоматом создать интерфейс админа , с помощью которого можно изменять , добавлять и удалять обьекты вручную . Для этого нужно зарегистрировать обьект :
 
 # models.py
 
 from django.db import models
 class Article(models.Model):
     pub_date = models.DateTimeField()
 
 # admin.py в том же каталоге
 
 import models
 from django.contrib import admin
 admin.site.register(models.Article)
 
 
Система URL - элегантная , как сказано в документации - работает по принципу конкретного урла конкретной функции . Внутри урла может быть регулярное выражение для отлова параметров . Например , если есть урл "/articles/2005/05/39323/", то будет вызвана функция с тремя параметрами .

Обьект View возвращает содержимое запрашиваемой страницы в виде обьекта HttpResponse. Она как правило загружает шаблон и рендерит в него динамические данные .

Для работы с шаблонами в джанго есть набор путей , по которым их можно найти . Переменные в шаблоне описываются с помощью двойных скобок :

 {{ article.headline }}
 
Переменную в шаблоне можно форматировать :
 {{ article.pub_date|date:"F j, Y" }}
 
В джанго есть концепция наследования шаблонов . Когда мы пишем :
 {% extends "base.html" %}
 
это значит , что сначала грузится шаблон base .

Для работы джанго нужен питон не ниже 2.5. Установить джанго можно по-разному : можно взять его из локального репозитария , можно взять официальный релиз - в этом случае ищите его тут - http://www.djangoproject.com/download/, или можно взять последнюю бету .

После инсталляции нужно сделать проверку : запустить питон и выполнить команду :

import django

2. Первое приложение

Напишем простой веб-сайт , который позволит посетителям проводить голосование .

Для начала запустим команду :

 django-admin.py startproject mysite
 
Будет создан каталог mysite , где и будет лежать наш сайт . Заходим в созданный каталог и видим :
 mysite/
     __init__.py
     manage.py
     settings.py
     urls.py
 
__init__.py - пустой файл , который подключает текущий каталог как стандартный питоновский пакет.
manage.py - утилита , управляющая сайтом
settings.py - конфигурация сайта
urls.py - таблица урлов , или таблица для всего контента сайта
Если запустить команду :
 python manage.py runserver
 
то увидим :
 Validating models...
 0 errors found.
 
 Django version 1.0, 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/ , то мы увидим приглашение.

Теперь давайте прикрутим базу данных . В файле settings.py пропишем :

 DATABASE_ENGINE = 'postgresql_psycopg2' 
 DATABASE_NAME   = 'mysite'
 DATABASE_USER   = 'postgres'
 TIME_ZONE = 'Europe/Moscow'
 LANGUAGE_CODE = 'ru-ru'
 
Предварительно у вас уже должен быть установлен и запущен постгрес. Запускаем 2 команды:
 psql -d template1 -U postgres -c "DROP DATABASE mysite;"
 psql -d template1 -U postgres -c "CREATE DATABASE mysite WITH OWNER postgres ENCODING='UNICODE';"
 
Запускаем команду :
   python manage.py syncdb
 
Первые 2 команды создают базу mysite , последняя команда создает в этой базе около 10 системных таблиц .

Теперь сгенерируем каркас веб-приложения :

   python manage.py startapp polls
 
Появится каталог polls со следующей структурой :
 polls/
     __init__.py
     models.py
     tests.py
     views.py
 
Перейдем к моделям и создадим 2 модели : polls и choices . Poll будет хранить вопросы , choices будет хранить 2 поля для голосования . В файле models.py запишем :
 from django.db import models
 
 class Poll(models.Model):
     question = models.CharField(max_length=200)
     pub_date = models.DateTimeField('date published')
 
 class Choice(models.Model):
     poll = models.ForeignKey(Poll)
     choice = models.CharField(max_length=200)
     votes = models.IntegerField()
 
Каждая модель представлена своим собственным классом. В классе есть переменные , представляющие поля данных в соответствующей таблице . ForeignKey указывает на то , что каждый choices связан с определенным poll . Вообще , джанго поддерживает все основные типы связей : many-to-ones, many-to-manys , one-to-ones.

Теперь нужно проинициализировать приложение в settings.py , добавив туда последнюю строку :

 INSTALLED_APPS = (
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
     'mysite.polls'
 )
 
Теперь сохраняем изменения в модели и переносим их на базу данных :
   python manage.py sql polls
   python manage.py syncdb
 
Добавим в модель по методу для каждого обьекта
 class Poll(models.Model):
     # ...
     def __unicode__(self):
         return self.question
 
 class Choice(models.Model):
     # ...
     def __unicode__(self):
         return self.choice
 

Admin

Теперь перейдем к админской части , которая по умолчанию отключена . Для ее включения добавим строку :
 INSTALLED_APPS = (
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
     'mysite.polls',
     'django.contrib.admin'      
 )
 
После этого запустим команду :
 python manage.py syncdb
 
В файле urls.py раскомментируем 3 строки :
 from django.contrib import admin
 admin.autodiscover()
 
Запускаем веб-приложение :
   python manage.py runserver
 
Набираем в броузере адрес :
   http://127.0.0.1:8000/admin/
 
Открывается форма с логином и паролем . После входа попадаем на стартовую страницу админки . В каталоге polls создадим файл admin.py с таким содержанием :
   from mysite.polls.models import Poll
   from django.contrib import admin
   admin.site.register(Poll)
 
Теперь можно вручную добавлять , изменять и удалять обьекты poll . Точно также регистрируем choices :
   from mysite.polls.models import Choice
   admin.site.register(Choice)
 

Views

Вернемся к веб-приложению и его внешнему интерфейсу - views. В нашем приложении мы создадим 4 View :
   1 Страница со списком polls
   2 Страница самого poll
   3 Страница результатов
   4 Страница для vote
 
В urls.py есть urlpatterns , которая представляет из себя коллекцию типа :
   (regular expression, Python callback function [, optional dictionary])
 
Изменим urls.py :
 from django.conf.urls.defaults import *
 
 from django.contrib import admin
 admin.autodiscover()
 
 urlpatterns = patterns('',
     (r'^polls/$', 'mysite.polls.views.index'),
     (r'^polls/(?P\d+)/$', 'mysite.polls.views.detail'),
     (r'^polls/(?P\d+)/results/$', 'mysite.polls.views.results'),
     (r'^polls/(?P\d+)/vote/$', 'mysite.polls.views.vote'),
     (r'^admin/', include(admin.site.urls)),
 )
 
Переходим ко вьюхам :
 from django.http import HttpResponse
 
 def index(request):
     return HttpResponse("Hello, world. You're at the poll index.")
 
Наберем в броузере урл :
   http://127.0.0.1:8000/polls/
 
Добавим во вьюху :
 def detail(request, poll_id):
     return HttpResponse("You're looking at poll %s." % poll_id)
 
Наберем урл :
   http://127.0.0.1:8000/polls/1/
 
Каждая вьюха возвращает обьект HttpResponse либо исключение типа Http404. Перепишем функцию index , которая будет возвращать последние 5 голосований :
 from mysite.polls.models import Poll
 from django.http import HttpResponse
 
 def index(request):
     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
     output = ', '.join([p.question for p in latest_poll_list])
     return HttpResponse(output)
 
Прикрутим шаблон к этой вьюхе : создадим в каталоге mysite подкаталог templates , в нем создадим еще один подкаталог - polls , положим в него файл index.html , пропишем в settings.py :
 import os
 
 TEMPLATE_DIRS = [os.path.join(os.path.dirname(__file__), "templates")]
 
Во вьюхе пропишем :
 from django.shortcuts import render_to_response
 from mysite.polls.models import Poll
 
 def index(request):
     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
     return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})
 
 def detail(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     return render_to_response('polls/detail.html', {'poll': p})
 
 
Добавим шаблон detail.html :
 {{ poll.question }}
 
 {% if error_message %}

{{ error_message }}

{% endif %}
{% for choice in poll.choice_set.all %}
{% endfor %}
перепишем урлы :
 urlpatterns = patterns('mysite.polls.views',
     (r'^$', 'index'),
     (r'^(?P\d+)/$', 'detail'),
     (r'^(?P\d+)/results/$', 'results'),
     (r'^(?P\d+)/vote/$', 'vote'),
 )
 
Теперь вместо http://127.0.0.1:8000/polls/ набираем просто http://127.0.0.1:8000/

Окончательно вьюха теперь имеет вид :

 from django.shortcuts import get_object_or_404, render_to_response
 from django.http import HttpResponseRedirect
 from django.core.urlresolvers import reverse
 from mysite.polls.models import Choice, Poll
 
 
 def index(request):
     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
     return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})
 
 def detail(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     return render_to_response('polls/detail.html', {'poll': p})
 
 
 def vote(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     try:
         selected_choice = p.choice_set.get(pk=request.POST['choice'])
     except (KeyError, Choice.DoesNotExist):
         # Redisplay the poll voting form.
         return render_to_response('polls/detail.html', {
             'poll': p,
             'error_message': "You didn't select a choice.",
         })
     else:
         selected_choice.votes += 1
         selected_choice.save()
         # Always return an HttpResponseRedirect after successfully dealing
         # with POST data. This prevents data from being posted twice if a
         # user hits the Back button.
         return HttpResponseRedirect(reverse('mysite.polls.views.results', args=(p.id,)))
 
 def results(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     return render_to_response('polls/results.html', {'poll': p})
 
 
 
Добавим шаблон results.html :
 {{ poll.question }}
 
    {% for choice in poll.choice_set.all %}
  • {{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
  • {% endfor %}
При попадании на страницу голосования , жмем на кнопку , и попадаем на результаты голосования : http://127.0.0.1:8000/1/results/

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

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье
sema
  very usefull tnx
2012-10-29 23:13:37