Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
 Алгоритмы
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
 Secure Programming for Li...6500 
 Linux Kernel 2.6...5278 
 Trees...1112 
 Максвелл 3...1046 
 William Gropp...984 
 Go Web ...953 
 Ethreal 3...921 
 Gary V.Vaughan-> Libtool...911 
 Ethreal 4...908 
 Ext4 FS...897 
 Clickhouse...895 
 Rodriguez 6...895 
 Ethreal 1...888 
 Steve Pate 1...873 
 C++ Patterns 3...858 
 Assembler...845 
 Ulrich Drepper...838 
 DevFS...779 
 MySQL & PosgreSQL...761 
 Стивенс 9...752 
 
  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