пятница, 24 августа 2012 г.

Python Примеры программ

Запуск Python из консоли командной строки и выход из него.


1. Пуск > Все программы > Стандартные > Командная строка
2. Далее в "черном квадрате" командной строки набираете:

сd C:\Python27\

и нажимаете Enter. 

Это команда смены директории. В результате вы попадете в папку Python27, в которую был установлен ваш Python. Если при установке вы ничего не меняли, то в таком случае Python был установлен на диск С.

Python27 это версия программы. Цифры могут быть разные в зависимости от вашей версии.

3. Далее вводите в командную строку

python

и нажимаете Enter. В результате Python начнет работать.

4. Для того, чтобы выйти из Python, находясь в консоли нажмите Ctrl + Z и затем нажмите Enter.

Запуск из консоли программы, написанной на языке Python и хранящейся в отдельном файле на жестком диске.


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

cd C:\Путь до папки с вашим файлом\

и нажмите Enter.

В результате вы перейдете в папку, в которой хранится ваш файл с программой.

Наберите в консоли название вашего файла, например

my_programm.py
(или python my_programm.py)

и нажмите Enter.

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

Так же вы можете запустить вашу программу, написанную на языке Python, перетаскиванием иконки файла с кодом программы в окно консоли командной строки. При этом в командной строке автоматически появится путь до файла. После этого нажмите Enter и ваша программа запустится. Python при этом запускать не надо.

Команды Python.


Для отделения команд друг от друга в Python используются обязательные переходы на следующую строку и отступы перед командами в виде 4-х пробелов.

# Комментарии

# - это однострочный комментарий.
# Многострочных комментариев в Python нет.
# Для многострочных комментариев каждую строку
# необходимо начинать с символа #.

# Ниже расположен код, который обеспечивает правильную обработку
# русских букв в коде вашей программы.
# Без этого кода возникнет ошибка и программа не запустится.
# Данный код должен размещаться в самом начале вашего файла с программой.

# -*- coding: utf-8 -*-

# Математические символы

+   # это символ сложения
-    # это символ вычитания
*    # это символ умножения
/     # это символ деления
%   # это символ получения остатка от деления

# Символы сравнения 

<    # это символ меньше чем
>    # это символ больше чем
<=  # это символ меньше чем или равно этому
>=  # это символ больше чем или равно этому
==  # это символ равно
!=   # это символ неравно

# Булевы значения 

True
False

#Логические значения

and # это символ логического и
or   # это символ логического или
not # это символ логического не

# Создание переменных и действия над ними.

cars = 100.0
drivers = 30.0
cars_without_drivers = cars - drivers
car_color = "Красный"
boat_color = "Синий"
what_color = "Какой цвет у машины? %r"
water = True
gas = False 

# Вывод текста на экран.

print "Данный текст будет выведен на экран."
print 'В коде программы можно использовать как двойные, так и одинарные кавычки.'
print gas
print "Результат вычисления равен: ", (100 - 50 + 10) / 60 * 30
print "Два меньше, чем пять? ", 2 < 5
print "Сегодня останется только", cars_without_drivers , "машин без водителей."
print "Количество машин в автопарке равно %d." % cars
print "У всех машин цвет %s." % car_color
print "У нас %d автомобилей и %d водителей." % (cars, drivers)
print "Всех вместе у нас %d штук. " % (cars + drivers)
print "Для округления чисел с плавающей точкой используйте функцию round(). В результате вы получите %r." % round(1.7333)
print "Сегодня утром пошел белый  %s" % 'снег.'
print  what_color % car_color
print car_color + boat_color
print "Папа " + "и " + "мама."
print "." * 10 # выведет на экран 10 точек
print "Команды можно записывать в строчкку";print "Отделяя их точкой с запятой.";print "Как и в других языках программирования."

# Специальные символы %d, %s и %r отвечают за подстановку
# соответствующих значений переменных в текст.
# %d - подставляет числа.
# %s - подставляет текстовые строки.
# %r - выводит все данные без разбора.

formatter = "%r %r %r %r"
print formatter % (1, 2, 3,4 )
print formatter % ("one", "two", "three", "four")
print formatter % (True, False, False, True)
print formatter % (formatter, formatter, formatter, formatter)
print formatter % (
    "I had this thing.",
    "That you could type up right.",
    "But it didn't sing.",
    "So I said goodnight."
)

months = "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"
print "Следующий текст будет разбит на строки: ", months

print """
С помощью трех двойных (или трех одинарных) кавычек
можно выводить
на экран текст
в подобном
отформатированном
виде.
"""

print "Используйте символ \" для вывода кавычек на экран."
print "Символ \t используется для вывода табуляции."

# Значения специальных символов.

Символы Что делает
\\ Обратная косая черта (\)
\' Одинарная кавычка (')
\" Двойная кавычка (")
\a ASCII Bell (BEL)
\b ASCII Backspace (BS)
\f ASCII Formfeed (FF)
\n ASCII Linefeed (LF)
\N{name} Character named name in the Unicode database (Unicode only)
\r ASCII Переход на следующую строку
\t ASCII Табуляция
\uxxxx Character with 16-bit hex value xxxx (Unicode only)
\Uxxxxxxxx Character with 32-bit hex value xxxxxxxx (Unicode only)
\v ASCII Vertical Tab (VT)
\ooo Character with octal value ooo
\xhh Character with hex value hh

# Ввод данных из консоли и запись их в переменные.

print "Сколько вам лет?"
age = raw_input()
print "Какой у вас рост?"
height = raw_input()
print "Какой у вас вес?"
weight = raw_input()
print "Вам %r лет, ваш рост %r сантиметров и ваш вес равен %r килограмм." % (age, height, weight)
print "Данные из консоли берутся как строки. Поэтому используется форматер %r"
print "Для преобразования вводимых данных в числа воспользуйтесь следующим кодом:"
digits = int(raw_input())
print "%d - это числовые данные" % digits
# Стоит избегать использование просто функции input() для ввода данных, из-за того, что она не всегда работает правильно.
name = raw_input ("Как вас зовут? ")
print name

# Подстановка значений в программу при её запуске из консоли

Перенесите в ваш файл следующий код:

# -*- coding: utf-8 -*-

from sys import argv

script, first, second, third = argv

print "Вызван script: ", script
print "Ваша перевая переменная это: ", first
print "Ваша вторая переменная это: ", second
print "Ваша третья переменная это: ", third

Введите в консоли имя вашего файла и список модулей:
my_programm.py first 2nd 3rd
и нажмите Enter.

В результате преденные значения по порядку будут подставлены в ваши переменные и сообщения будут выведены на экран.

# Чтение содержимого текстового файла и вывод его на экран.

Создайте текстовый файл с именем sample.txt и поместите его в папку с вашей программой my_programm.py.

В файл sample.txt вставьте следующий текст:

Этот текст находится во внешнем файле.
При запуске программы он отображается на экране.
Это очень здорово!

Далее откройте файл с вашей программой и введите в него следующий код:

# -*- coding: utf-8 -*-

from sys import argv

script, filename = argv

txt = open(filename)

print "Мы открываем файл %r и выводим из него следующий текст:" % filename
print txt.read()

txt.close()

Теперь откройте консоль и запустите вашу программу с параметром соотвествующим имени вашего файла с текстом (sample.txt):

my_programm.py sample.txt

В результате выполнения вашей программы содержимое файла sample.txt будет выведено на экран.

# Чтение и запись данных в файлы

Основные команды чтения и записи данных в файлы:
read() - читает содержимое файла, которое может быть также присвоено переменной.
readline() - считывает только одну строку из файла.
truncate() - удаляет все содержимое из файла.
write("текстовое содержимое") - записывает текстовое содержимое в файл.
close() - закрывает файл. (Аналогично команде File->Save.. в вашем текстовом редакторе.)

Запустите вашу программу my_programm.py, вставив в неё следующий код:

# -*- coding: utf-8 -*-

filename = raw_input ("Введите имя файла:")
target = open (filename, "w") # "w" означает открыть файл с разрешением на запись

print "Сейчас мы удалим все содержимое из файла %r." % filename
target.truncate()

line1 = raw_input("Строка 1:")
line2 = raw_input("Строка 2:")
line3 = raw_input("Строка 3:")

print "Теперь мы запишем в файл введенные строки."

target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

print "Далее мы закроем файл."

target.close()

Парамеры функции open()
"r" - открыть файл только для чтения.
"w" - открыть файл для записи.
"a" - открыть файл для добавления в него нового фрагмента.

# Копирование содержимого из одного файла в другой файл.

 # -*- coding: utf-8 -*-

from sys import argv
from os.path import exists

script, from_file, to_file = argv

print "Сейчас мы скопируем содержимое из файла %r в файл %r." % (from_file, to_file)

first_file = open(from_file)
file_content = open_from_file.read()

print "Содержимое копируемого файла занимает %d байт." % len(file_content)

print "Существует ли файл, в который мы будем вставлять содержимое? %r" % exists(to_file)

second_file = open(to_file, 'w')
second_file.write(file_content)

first_file.close()
second_file.close()

print "Копирование успешно завершено."

При запуске программы из коносли добавьте имя любого файла, из которого будет скопировано содержимое, и имя любого файла, в который оно будет вставлено:

my_programm.py copy.txt paste.txt

# Массивы - списки

the_count = [1, 2, 3, 4, 5]
fruits = ['apples', 'oranges', 'pears', 'apricots']
change = [1, 'pennies', 2, 'dimes', 3, 'quarters']
change[0] = 'one'
print change[0]
print the_count

# Хэш - массивы - словари

cities = {
    'CA': 'San Francisco',
    'MI': 'Detroit',
    'FL': 'Jacksonville'
}

# Добавим еще значения в массив.
cities['NY'] = 'New York'
cities['OR'] = 'Portland'

# Выведем некотрые значения из массива на экран.
print "NY - это: ", cities['NY']
print "OR - это: ", cities['OR']

for abbrev, city in cities.items():
    print "%s соотвествует городу %s" % (abbrev, city)

city = cities.get('Texas', None)

if not city:
    print "Простите, но Texas нет в массиве."

# Условия

dogs = 10
cats = 20

if dogs > cats:
    print "Собак больше, чем кошек."
elif dogs < cats:
    print "Собак меньше, чем кошек."
else:
    print "Число собак равно числу кошек."

# Условия могут быть вложенными. В этом случае вложенные условия отделяются дополнительными четыремя пробелами от левой границы экрана.

# В Python нет уловий вида switch-case.

# Циклы

# В Python циклы отличаются от классических. Основная идея в них - это перебор элементов, что в принципе и происходит в любом цикле в других языках программирования.

# -*- coding: utf-8 -*-

count = [1, 2, 3, 4, 5] # Это массив.

# Циклы For

# В этом цикле производится перебор всех элементов массива.
for number in count:
    print "Это счет: %d" % number
   
elements = [] # Так создается пустой массив

# Это пример классического цикла с шагом +1. Шаг цикла задается через range().
for i in range(0,10):
    elements.append(i)

for i in elements:
    print "Элемент %d был добавлен в массив." % i

#  Циклы While

i = 0
numbers = []

while i < 6:
    print "В массив добавлено число %d" % i
    numbers.append(i)
    i = i + 1

# Функции

# Определиение функции
def print_arguments (arg1, *argv):
    # Все содержимое функции должно быть отделено 4 пробелами слева.
    arg2, arg3 = argv
    print "Аргумент 1: %r, аргумент 2: %r, аргумент 3: %r." % (arg1, arg2, arg3)
# Тело функции завершает на следующей строче, начинающейся без пробелов прямо от левой границы экрана.

# Выполнение функции
print_arguments ("Один", "Два", "Три")

Звездочка * у argv позволяет принять функции несколько аргументов в виде списка. В большинстве случаев такой способ передачи аргументов в функцию не используется.

# Функция, возвращающая значение, после своего выполнения.

def sum(a, b):
    return a + b

print "Сумма равна: %d" % sum (2, 5)

# Функцию можно передавать в качестве аргумента и вызывать её через Callback.

def sum():
    return 2 + 5
   
def callback(c):
    return c()

print "Сумма равна: %d" % callback(sum)

# Функции могут возвращать несколько значений в виде спика, разделенного запятыми.

def list_values():
    return "one", "two", "three"

var1, var2, var3 = list_values()

print var1
print var2
print var3

# Модули - импортирование кода из других файлов

# Для того, чтобы загрузить код из другого файла, необходимо сделать import.
# После этого вызов кода осуществляется через имя импортированного файла.

Файл mystuff.py
# Этот код размещен в файле mystuff.py

fruit = "pineapple"

def apple():
    print "I am apple!"
   
Файл my_programm.py
# Этот код размещен в основном исполняем файле my_programm.py

import mystuff

print mystuff.fruit
mystuff.apple

# Поскольку модули импортируются, то они могу существовать только в одном экземляре, в отличии от классов.

# Также можно импортировать из файла отдельные классы или функции с переменными.

Файл my_programm.py
from mystuff import apple

apple()

# Или можно импортировать все сразу, используя символ *.

Файл my_programm.py
from mystuff import *

apple()

# Классы и Объекты 

# Классы представляют из себя мини-модули. Они предназначены для группировки и изолирования функций и данных. Но в отличии от модулей, классы могут существовать во множестве экземпляров, называемых объектами.

# Методы в классах всегда имеют всегда имеют первый аргумент под названием self.

# -*- coding: utf-8 -*-

class Employee:
    pass # pass означает, что класс пустой, в нем пока ничего нет.

def work():
    print "I am working."
   
john = Employee() # Создание объекта рабочий.

# Заполнение объекта данными
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000
john.work = work

print john.name
print john.dept
print john.salary

john.work()

class MyStuff(object):

    txt = "Super text!"

    # Методы в классах всегда имеют всегда имеют первый аргумент под названием self.
    def __init__(self):
        self.tangerine = "And now a thousand years between"

    def apple(self):
        print "I AM CLASSY APPLES!"

thing = MyStuff()
print thing.txt
print thing.tangerine
thing.apple()

class A(object):
    def __init__(self, x): # атрибут получает значение в конструкторе
        self.x = x

a = A(5)
print a.x

class A(object):
    def __init__(self, x):
        self._x = x
    def getx(self): # метод для получения значения
        return self._x
    def setx(self, value): # присваивания нового значения
        self._x = value
    def delx(self): # удаления атрибута
        del self._x                
    x = property(getx, setx, delx, "Свойство x")  # определяем x как свойство

a = A(5)
# или a.x = 5    
print a.x  # Синтаксис доступа к атрибуту при этом прежний

class Song(object):

    def __init__(self, lyrics):
        self.lyrics = lyrics

    def sing_me_a_song(self):
        for line in self.lyrics:
            print line

happy_bday = Song(["Happy birthday to you",
                   "I don't want to get sued",
                   "So I'll stop right there"])

bulls_on_parade = Song(["They rally around the family",
                        "With pockets full of shells"])

happy_bday.sing_me_a_song()

bulls_on_parade.sing_me_a_song()

# Для создания экземпляра класса, достаточно вызвать класс по имени и задать параметры конструктора:
class Point:
         def __init__(self, x, y, z):
             self.coord = (x, y, z)
         def __repr__(self):
             return "Point(%s, %s, %s)" % self.coord

p = Point(0.0, 1.0, 0.0)

# Специальные методы вызываются при создании экземпляра класса (конструктор) и при удалении класса (деструктор).
# В языке Python реализовано автоматическое управление памятью, поэтому деструктор требуется достаточно редко, для ресурсов, требующих явного освобождения.

class Line:
    # Конструктор создает объект с начальными параметрами.
    def __init__(self, p1, p2):
        self.line = (p1, p2)
    # Деструктор удаляет созданный объект из памяти компьютера.
    def __del__(self):
        print "Удаляется линия %s - %s" % self.line

# Создание объекта. Срабатывает метод __init(self, p1, p2)__       
l = Line((0.0, 1.0), (0.0, 2.0))

# Удаление объекта. Срабатывает метод __del__
del l

# Наследование классов.

class Parent(object):

    def implicit(self):
        print "PARENT implicit()"

class Child(Parent):
    pass

dad = Parent()
son = Child()

dad.implicit()
son.implicit()

# Наследованием и переопределение методов в потомках классов.

class Parent(object):

    def override(self):
        print "PARENT override()"

class Child(Parent):
  
    def override(self):
        print "CHILD override()"

dad = Parent()
son = Child()

dad.override()
son.override()
# Явно указав имя класса, можно обратиться к методу родителя, как впрочем и любого другого объекта.

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)

# В общем случае для получения класса-предка применяется функция super.

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__(self)

# Таким образом в классе-потомке можно вызвать неизмененный родительский метод после его переопределения.

class Parent(object):

    def altered(self):
        print "PARENT altered()"

class Child(Parent):
   
    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()
        print "CHILD, AFTER PARENT altered()"

dad = Parent()
son = Child()

dad.altered()
son.altered()

# Класс-потомок также может наслежовать методы и атрибуты от нескольких классов-родителй.

class SuperFun(Child, BadStuff): # Класс наследует от 2-х классов.
    pass

Получать доступ к классам и модулям можно тремя способами:

# стиль массива
mystuff['apples']

# стиль модуля
mystuff.apples()
print mystuff.tangerine

# стиль класса
thing = MyStuff()
thing.apples()
print thing.tangerine

Ключевые слова:

and
del
from
not
while
as
elif
global
or
with
assert
else
if
pass
yield
break
except
import
print
class
exec
in
raise
continue
finally
is
return
def
for
lambda
try

Типы переменных:


True
False
None
strings
numbers
floats
lists (массивы)

Escape-символы:

\\
\'
\"
\a
\b
\f
\n
\r
\t
\v

Строковые форматеры для использования в print:

%d
%i
%o
%u
%x
%X
%e
%E
%f
%F
%g
%G
%c
%r
%s
%%

Операторы:

+
-
*
**
/
//
%
<
>
<=
>=
==
!=
<>
( )
[ ]
{ }
@
,
:
.
=
;
+=
-=
*=
/=
//=
%=
**=

четверг, 23 августа 2012 г.

Django Активация интерфейса администратора

Интерфейс администратора не активирован по умолчанию. Что бы его активировать выполните следующие действия:

Раскомментируйте "django.contrib.admin" в настройке INSTALLED_APPS.

Выполните python manage.py syncdb. После добавления приложения в INSTALLED_APPS база данных должна быть обновлена.

Отредактируйте файл mysite/urls.py, раскомментировав строки, которые относятся к интерфейсу администратора – всего должно быть три строки.
Этот файл – конфигурация URL-ов. Он определяет соответствие URL-ов приложениям. У вас должен получиться следующий файл 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

Откроем "/admin/" локального домена в браузере – например, http://127.0.0.1:8000/admin/. Вы должны увидеть страницу авторизации интерфейса администратора:

Django admin login screen
Если вместо страницы авторизации вы получили ошибку:

ImportError at /admin/
cannot import name patterns

значит вы используете не верную версию Django.

Заходим в интерфейс администратора

Теперь авторизируемся. (Для этого вы должны были ранее создать суперпользователя. Если вы этого не сделали или забыли пароль, создайте еще одного.) Вы должны увидеть главную страницу интерфейса администратора Django:

Django admin index page

Вы должны увидеть несколько разделов включая группы, пользователей и сайты. Это встроенные основные приложения Django.

Добавим приложение голосования в интерфейс администратора.

Нам нужно указать, что объекты модели Poll могут редактироваться в интерфейсе администратора. Для этого создадим файл admin.py в каталоге polls, и отредактируем следующим образом:

from polls.models import Poll
from django.contrib import admin

admin.site.register(Poll)

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

Изучим возможности интерфейса администратора

После регистрации модели Poll Django отобразит ее на главной странице:

Django admin index page, now with polls displayed

Нажмите "Polls". Вы попали на страницу "списка объектов" для голосований. Эта страница содержит все объекты из базы данных и позволяет выбрать один из них для редактирования. Мы видим голосование "What’s up?", которое создали в первой части учебника по Django:

Polls change list page

Нажмите "What’s up?" чтобы отредактировать его:

Editing form for poll object

Заметим:

Форма автоматически создается с модели голосования.

Для различных типов полей модели (DateTimeField, CharField) используются соответствующие HTML поля. Каждое поле знает как отобразить себя в интерфейсе администратора.

К полям DateTimeField добавлен JavaScript виджет. Для даты добавлена кнопка "Сегодня" и календарь, для времени добавлена кнопка "Сейчас" и список распространенных значений.

В нижней части страницы мы видим несколько кнопок:

Save – сохранить изменения и вернуться на страницу списка объектов.

Save and continue editing – сохранить изменения и снова загрузить страницу редактирования текущего объекта.

Save and add another – сохранить изменения и перейти на страницу создания нового объекта.

Delete – показывает страницу подтверждения удаления.




Если значение "Date published" не совпадает с временем создания объекта в первой части учебника, возможно вы не верно определили настройку TIME_ZONE. Измените ее и перезагрузите страницу.

Измените "Date published", нажав "Today" и "Now". Затем нажмите "Save and continue editing". Теперь нажмите "History" в правом верхнем углу страницы. Вы увидите все изменения объекта сделанные через интерфейс администратора, время изменений и пользователя, который их сделал:

History page for poll object

Далее идет дальнейшее описание. Но я здесь его пока приводить не буду.

Django Создание проекта

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

Создавая приложение убедитесь что вы находитесь в том же каталоге, что и файл manage.py, и выполните команду:

python manage.py startapp polls

Эта команда создаст каталог polls:

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

Эти файлы являются частью приложения голосования.

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

Модель - это основной источник данных. Он содержит набор полей и поведение данных, которые вы храните.

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

Отредактируйте файл polls/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()

Код очень простой. Каждая модель представлена подклассом django.db.models.Model. Каждая модель содержит несколько атрибутов, каждый из которых отображает поле в таблице базы данных.

Каждое поле представлено экземпляром класса Field. Например, CharField для текстовых полей и DateTimeField для полей даты и времени. Это указывает Django какие типы данных хранят эти поля.

Названия каждого экземпляра Field (например, question или pub_date ) это название поля, в "машинном" формате. Вы будете использовать эти названия в коде, а база данных будет использовать их как названия колонок.

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

Некоторые подклассы Field содержат обязательные параметры. CharField, например, требует аргумент max_length. Этот аргумент используется не только при создании таблицы, но и при проверке данных, что мы скоро увидим.

Заметим, что связь между моделями определяется с помощью ForeignKey. Это указывает Django что каждый Choice связан с одним объектом Poll. Django поддерживает все основные типы связей: многие-к-одному, многие-ко-многим и один-к-одному.

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

Эта небольшая часть кода моделей предоставляет Django большое количество информации, которая позволяет Django:

Создать структуру базы данных (CREATE TABLE) для приложения.
Создать Python API для доступа к данным объектов Poll и Choice.

Но первым делом мы должны указать нашему проекту, что приложение polls установлено.

Отредактируйте файл settings.py и измените настройку INSTALLED_APPS добавив строку 'polls'. В результате получим:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'polls',
)

Теперь Django знает что необходимо использовать приложение polls. Давайте выполним следующую команду:

python manage.py sql polls

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

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

Обратите внимание на следующее:

Полученные запросы зависят от базы данных, которую вы используете.
Названия таблиц созданы автоматически из названия приложения(polls) и названия модели в нижнем регистре – poll и choice. (Вы можете переопределить это.)
Первичные ключи (ID) добавлены автоматически. (Вы можете переопределить и это.)
Django добавляет "_id" к названию внешнего ключа. (Да, вы можете переопределить и это.)
Внешний ключа определяется явно через REFERENCES.
Учитываются особенности базы данных, которую вы используете. Специфические типы данных такие как auto_increment (MySQL), serial (PostgreSQL), или integer primary key (SQLite) будут использоваться автоматически. То же касается и экранирование называний, что позволяет использовать в названии кавычки – например, использование одинарных или двойных кавычек. Автор этого урока использует PostgreSQL, так что примеры используют синтаксис PostgreSQL.
Команда sql не выполняет SQL запросы в базе данных - она просто выводит их на экран, чтобы вы могли увидеть какой SQL создает Django. Если вы хотите, можете скопировать и выполнить этот SQL в консоли вашей базы данных. Однако, Django предоставляет более простой способ выполнять SQL в базе данных.

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

python manage.py validate – проверяет на ошибки структуру ваших моделей.
python manage.py sqlcustom polls – выводит дополнительные SQL запросы (такие как изменения в таблице или дополнительные правила) определенные для приложения.
python manage.py sqlclear polls – выводит необходимые DROP TABLE запросы для этого приложения, учитывая таблицы, которые уже существуют в базе данных (если такие есть).
python manage.py sqlindexes polls – выводит CREATE INDEX запросы для приложения.
python manage.py sqlall polls – выводит комбинацию SQL запросов команд sql, sqlcustom, из sqlindexes.

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

Теперь, выполните команду syncdb снова, чтобы создать таблицы для этих моделей в базе данных:

python manage.py syncdb

Команда syncdb выполняет все запросы из команды sqlall в вашей базе данных для всех приложений, которые находятся INSTALLED_APPS. Она создает все таблицы, загружает начальные данные и создает индексы для всех моделей всех приложений. Команда syncdb может выполняться любое количество раз и будут созданы только таблицы, которые еще не существуют.

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

Отредактируйте mysite/settings.py.
Измените значения следующих ключей в переменной DATABASES 'default' в соответствии с настройками вашей базы данных.

ENGINE – Доступные значения:
'django.db.backends.postgresql_psycopg2',
'django.db.backends.mysql',
'django.db.backends.sqlite3',
'django.db.backends.oracle'. Так же доступны другие бэкэнды.

NAME – Название базы данных.
Если вы используете SQLite, база данных будет файлом на вашем компьютере; в таком случае NAME должна содержать полный путь, включая название этого файла. Если файл не существует, он будет автоматически создан при первой синхронизации базы данных.

При определении пути, всегда используйте прямой слэш, даже в Windows (например, C:/homes/user/mysite/sqlite3.db).

USER – имя пользователя базы данных (не используется для SQLite).

PASSWORD – пароль к базе данных (не используется для SQLite).

HOST – хост на котором находится база данных. Оставьте пустым, если база данных находится на одном сервере с проектом (не используется для SQLite).

Если у вас нет опыта работы с базами данных, советуем использовать SQLite установив ENGINE в 'django.db.backends.sqlite3' и указав в NAME где вы хотите хранить базу данных. SQLite включен в Python 2.5 и выше, так что вам не нужно ничего устанавливать.

Если вы используете PostgreSQL или MySQL, убедитесь что вы создали базу данных. Мы можете сделать это выполнив запрос "CREATE DATABASE database_name;" в консоли базы данных.

Если вы используете SQLite, вам ничего не нужно создавать самостоятельно - файл базы данных будет создан при необходимости.

При редактировании settings.py, добавьте значение вашей временной зоны в TIME_ZONE. (Значение по-умолчанию - временной пояс Чикаго.)

Так же обратим внимание на INSTALLED_APPS в конце файла настроек. Эта переменная содержит приложения Django которые используются в проекте. Приложения могут использоваться в различных проектах, вы можете упаковать их и распространять другим пользователям.

По-умолчанию, INSTALLED_APPS содержит следующие приложения, все они включены в Django:

django.contrib.auth – система аутентификации.
django.contrib.contenttypes – "content types" фреймверк.
django.contrib.sessions – фреймверк сессии.
django.contrib.sites – фреймверк для использования нескольких сайтов с одной инсталяцией Django.
django.contrib.messages – фреймверк сообщений.
django.contrib.staticfiles – фреймверк для работы со статическими файлами.

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

Каждое приложение может использовать хотя бы одну таблицу в базе данных, по этому нам нужно их создать прежде чем мы сможем использовать их. Для этого выполните следующую команду:

python manage.py syncdb

Команда syncdb анализирует значение INSTALLED_APPS и создает все необходимые таблицы в базе данных, используя настройки базы данных из файла settings.py. Вы увидите сообщение о создании таблиц и предложение создать суперпользователя. Воспользуйтесь этим предложением.

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

Как мы уже сказали, приложения по-умолчанию полезны в большинстве проектов, но не во всех. Если вы не нуждаетесь в некоторых или во всех, закомментируйте или удалите соответствующие строки в INSTALLED_APPS перед запуском syncdb. Команда syncdb создает таблицы только для приложений в INSTALLED_APPS.

Django Создание проекта и запуск сервера

Создайте на жестком диске папку, в которой будут хранится файлы вашего проекта.

Откройте консоль командной строки и перейди в созданную вами папку.

Далее выполните введите следующую команду и нажмите Enter.

django-admin.py startproject mysite

Это создаст папку "mysite" в текущем выбранной папке.

Вы не должны использовать в качестве названия проекта названия компонентов Python или Django.

Это означает, что проект не может называться django (что конфликтует с Django) или test (конфликтует со стандартным пакетом Python).

Давайте посмотрим что создала команда startproject:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

Структура проекта по-умолчанию была недавно изменена. Если вы видите "простую" структуру (без внутреннего каталога mysite/), возможно вы используете версию Django которая не соответствует этому описанию. Вам следует читать старую версию учебника или обновить Django.

Рассмотрим эти файлы:

Внешний каталог mysite/ – просто контейнер для вашего проекта. Его название никак не используется Django и вы можете назвать его как угодно.

manage.py - скрипт, который позволяет вам взаимодействовать с проектом Django.

Внутренний каталог mysite/ - это пакет Python вашего проекта. Его название – это название пакета Python, которое вы будете использовать для импорта чего-либо из проекта (например, import mysite.settings).

mysite/__init__.py - пустой файл, который указывает Python, что текущий каталог является пакетом Python.

mysite/settings.py - настройки/конфигурация проекта.

mysite/urls.py - конфигурация URL-ов для вашего проекта Django.

mysite/wsgi.py -  точки входа для WSGI-совместимый веб-серверов.

Давайте проверим как работает этот проект. Перейдите во внешний каталог mysite, если вы этого еще не сделали, и выполните команду python manage.py runserver. Вы увидите следующий вывод:

Validating models...
0 errors found.

Django version 1.4, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.


Только что вы запустили сервер для разработки Djang - простой Web-сервер написанный на Python.


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

По-умолчанию, команда runserver запускает сервер для разработки на локальном IP используя порт 8000.

Если вы хотите изменить порт, укажите его через аргумент. Например, эта команда запускает сервер используя порт 8080:

python manage.py runserver 8080

Если вы хотите изменить IP, передайте его вместо со значением порта. Что бы прослушивать все публичные IP (полезно, если вы хотите показать свою работу на других компьютерах), используйте:

python manage.py runserver 0.0.0.0:8000

Django Запуск и проверка работы из консоли

Чтобы проверить, что Django доступен для Python, откройте консоль командной строки.

Перейдите в папку, в которую был установлен Python, набрав в консоли cd C:\Python26\ и нажав Enter.

Теперь наберите в консоли python и нажмите Enter. В результате запустится Python.

После этого в консоли выполните импорт Django, набрав import django и нажав Enter.

Далее наберите print django.get_version().

В результате в консоли появится версия вашей Django.

среда, 22 августа 2012 г.

Django Templates Простые шаблоны

 Пример простого шаблона.

<html>
<head><title>Ordering notice</title></head>

<body>

<h1>Ordering notice</h1>

<p>Dear {{ person_name }},</p>

<p>Thanks for placing an order from {{ company }}. It's scheduled to
ship on {{ ship_date|date:"F j, Y" }}.</p>

<p>Here are the items you've ordered:</p>

<ul>
{% for item in item_list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

{% if ordered_warranty %}
    <p>Your warranty information will be included in the packaging.</p>
{% else %}
    <p>You didn't order a warranty, so you're on your own when
    the products inevitably stop working.</p>
{% endif %}

<p>Sincerely,<br />{{ company }}</p>

</body>
</html>

Любой текст, окруженный парой фигурных скобок {{ person_name }}, является переменной, что означает "вставить значение переменной, имеющей данное имя в это место".

Любой текст, окруженный парой фигурных скобок и знаками процента {% if ordered_warranty %} является тэгом. Тэг говорит шаблонной системе выполнить в этом месте некоторые действия.

Для примера шаблон содержит тэг for ({% for item in item_list %}) и тэг if {% if ordered_warranty %}.

Для форматирования данных в переменных может использоваться специальный фильтр, который добавляется с использованием специального символа |. В фильтр {{ ship_date|date:"F j, Y" }} мы передаем переменную ship_date и аргументы "F j, Y". В итоге фильтр форматирует дату.

Список тэгов, используемых в Django.

if/else

Тэг {% if %} проверяет значение переменной. Если значение переменной “True”, то есть она существует, не пуста и не равна false, то система отобразит все, что заключено между тэгами {% if %} и {% endif %}.

Для примера:

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% endif %}

Тэг {% else %} является не обязательным:

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% else %}
    <p>Get back to work.</p>
{% endif %}

Тэг {% if %} принимает так же значения and, or, or not для проверки сразу нескольких переменных.

Для примера:

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are no athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are some athletes or some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

Тэги {% if %} позволяют одновременно указывать and и or внутри одного тэга.

Для примера, следующее будет неправильным:

{% if athlete_list and coach_list or cheerleader_list %}


Для разветвленной логики можно использовать несколько вложенных тэгов {% if %}

Для примера:

{% if athlete_list %}
    {% if coach_list or cheerleader_list %}
        We have athletes, and either coaches or cheerleaders!
    {% endif %}
{% endif %}

Вы не можете комбинировать различные операторы.

Следующее будет неверным:

{% if athlete_list or coach_list or parent_list or teacher_list %}

В системе не предусмотрено тэга {% elif %}. Вместо него используете несколько вложенных  тэгов {% if %} для реализации подобного функционала.

Для примера:
{% if athlete_list %}
    <p>Here are the athletes: {{ athlete_list }}.</p>
{% else %}
    <p>No athletes are available.</p>
    {% if coach_list %}
        <p>Here are the coaches: {{ coach_list }}.</p>
    {% endif %}
{% endif %}

for

Тэг {% for %} позволяет создавать циклы, в которых будут перебраны все значения переменных. На каждом шаге цикла система будет отрисовывать все, что находится между тэгами {% for %} и {% endfor %}.

Для примера, вы можете отобразить список атлетов, переданных в переменной athlete_list:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

Значения из переменной можно вывести и вобратном порядке:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

Циклы можно делать вложенными:

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

Распространенной практикой является проверка размера списка до начала цикла и вывода особого сообщения, если список оказался пуст:

{% if athlete_list %}
    {% for athlete in athlete_list %}
        <p>{{ athlete.name }}</p>
    {% endfor %}
{% else %}
    <p>There are no athletes. Only computer programmers.</p>
{% endif %}

Для вывода сообщения о пустой переменной можно использовать специальный тэг {% empty %}:

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}

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

С каждым циклом {% for %} вы получаете доступ к специальной переменной, называемой forloop. Эта переменная содержит несколько атрибутов, которые дают вам информацию о состоянии цикла в данный момент:
forloop.counter хранит число шагов уже пройденных циклом. Отсчет начинается с 1, то есть с начала цикла значение forloop.counter изменится с 0 на 1.

Для примера:

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

forloop.counter0 похож на forloop.counter, за исключением того, что отсчет в нем ведется с 0.

forloop.revcounter хранит число оставшихся объектов (item) в цикле. С начала цикла forloop.revcounter имеет значение общего цисла объектов в переданной вами последовательности. На последнем шаге цикла forloop.revcounter будет иметь значение 1.

forloop.revcounter0 похож на forloop.revcounter, за исключением того, что отсчет в нем ведется с 0. С начала цикла forloop.revcounter0 имеет значение общего цисла объектов в переданной вами последовательности минус 1. На последнем шаге цикла forloop.revcounter0 будет иметь значение 0.

forloop.first хранит в себе значение True, если это первый шаг цикла.

{% for object in objects %}
    {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
    {{ object }}
    </li>
{% endfor %}

forloop.last хранит в себе значение True, если это последний шаг цикла.

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

В результате выполнения данного цикла на экран будет выведена следующая последовательность:

Link1 | Link2 | Link3 | Link4

forloop.parentloop - это ссылка на объект forloop родительского цикла для случая вложенных циклов.

{% for country in countries %}
    <table>
    {% for city in country.city_list %}
        <tr>
          <td>Country #{{ forloop.parentloop.counter }}</td>
          <td>City #{{ forloop.counter }}</td>
          <td>{{ city }}</td>
        </tr>
    {% endfor %}
    </table>
{% endfor %}

Переменные forloop доступны только внутри циклов.

ifequal/ifnotequal

Для сравнения значений двух переменных используется тэг {% ifequal %}.
Тэг {% ifequal %} сравнивает два значения и отображает все, что находится между {% ifequal %} и {% endifequal %}, если значения совпадают.

Для примера:

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

Аргументы в выражении сравнения могут быть обычными строками внутри одинарных или двойных кавычек.

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% endifequal %}

{% ifequal section "community" %}
    <h1>Community</h1>
{% endifequal %}

Как в случае тэга {% if %}, тэг {% ifequal %} поддерживает необязательный тэг {% else %}:

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}

Для сравнения допускаются только переменные, содержащие тип: string, integers и decimal number:

{% ifequal variable 1 %}
{% ifequal variable 1.23 %}
{% ifequal variable 'foo' %}
{% ifequal variable "foo" %}

Все остальные типы переменных, такие как: dictionary, lists или Boolean, не могут быть выведены для сравнения в шаблоне.

Эти примеры будут недопустимы:

{% ifequal variable True %}
{% ifequal variable [1, 2, 3] %}
{% ifequal variable {'key': 'value'} %}

Если вам необходимо протестировать что-то на наличие true или false, то используйте тэг {% if %} вместо тэга {% ifequal %}.

Комментарии в коде

Шаблоны Django позволяют использовать комментарии в коде. Для обрамления комментариев используется последовательность символов {# #}:

{# This is a comment #}

Комментарии не обрабатываются при построении шаблона.

Комментарии не могут разбиваться на несколько строк.

В данном примере система не примет данную последовательность символов как комментарий и выведет весь текст на экран:

This is a {# this is not
a comment #}
test.

Если вам необходимо разбить комментарий на несколько строк, то воспользуйтесь тэгом {% comment %}:

{% comment %}
This is a
multi-line comment.
{% endcomment %}

Фильтры

Фильтры предназначены для преобразования данных, находящихся в переменных, в соответствии с заданным шаблоном. Фильтры отделяются специальным символм | вот так:

{{ name|lower }}

Данный фильтр преобразует весь текст из переменной name в текст с нижним регистром.

Вильтры могут быть объеденены в цепочки, выполняющие фильтры последовательно друг за другом:

{{ my_list|first|upper }}

Некоторые фильтры могут принимать аргументы, размещающиеся после двоеточия в двойных кавычках.

Для примера:

{{ bio|truncatewords:"30" }}

Это фильтр выведет на экран первые 30 слов из переменной bio.

Вот перечень самых важных фильтров:

addslashes - добавляет символ backslash перед любым символом backslash, одиночной кавычкой или двойной кавычкой. Это слежит защитой текста, включенного в JavaScript-строку.

date - форматирует дату или объект datetime в соотвествии с форматом строки, заданной в параметре фильтра:

{{ pub_date|date:"F j, Y" }}

length - возвращает длину переменной. Для списков возвращает число элементов. Для строк возвращает число символов.

include

Тэг {% include %} позволяет из файла загружать в шаблон содержимое другого шаблона. Аргументом тэга должен быть имя включаемого шаблона. Имя включаемого шаблона не совпадать с именем переменной или с содержимым строки, находящимся в кавычках.

Два примера включения в шаблон содержимого из файла nav.html:

{% include 'nav.html' %}
{% include "nav.html" %}

Допускается использовать как одинарные, так и двойные кавычки.

Пример включения файла includes/nav.html, содержащегося в другой папке:

{% include 'includes/nav.html' %}

Пример включения шаблона, название которого содержится в переменной template_name:

{% include template_name %}

Наследование шаблонов

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

Шаблонный тэг {% block %} сообщает шаблонной системе, что она может заменить эти порции кода на дочерние шаблоны.