Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...2332 
 Trees...1458 
 William Gropp...1414 
 Ethreal 3...1397 
 Ethreal 4...1379 
 C++ Patterns 3...1374 
 Rodriguez 6...1365 
 Максвелл 3...1363 
 Robert Love 5...1361 
 Httpd-> История Ap...1361 
 Go Web ...1360 
 Максвелл 5...1359 
 OS ->Intel Manual 1...1358 
 Ext4 FS...1357 
 K&R 1...1357 
 Rubni-Corbet -> Глав...1353 
 Perl OOP...1352 
 Kamran Husain...1351 
 Сетунь...1351 
 Erlang...1350 
 
  01.01.2024 : 3621733 посещений 

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