Django: краткое руководство по интернационализации

Что нового в Django 3.2 ¶

Автоматическое обнаружение

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

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

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

С автоматическим обнаружением больше не требуется. Как следствие, он устарел.

См. Подробную информацию в разделе « .

Настройка типа автоматически создаваемых первичных ключей

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

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

Сохраняя историческое поведение, значение по умолчанию
— . Начиная с версии 3.2 новые проекты создаются со значением
. Кроме того, новые приложения создаются со

значением . В будущем выпуске Django значение по умолчанию будет изменено на
.

Чтобы избежать нежелательных миграции в будущем, либо в явном виде установить
на :

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

или настройте его для каждого приложения:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.AutoField'
    name = 'my_app'

или для каждой модели:

from django.db import models

class MyModel(models.Model):
    id = models.AutoField(primary_key=True)

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

Функциональные показатели

Новый позиционный аргумент позволяет создавать функциональные индексы для выражений и функций базы данных. Например:

from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper


class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    height = models.IntegerField()
    weight = models.IntegerField()

    class Meta
        indexes = 
            Index(
                Lower('first_name'),
                Upper('last_name').desc(),
                name='first_last_name_idx',
            ),
            Index(
                F('height')  (F('weight') + Value(5)),
                name='calc_idx',
            ),
        

Функциональные индексы добавляются к моделям с помощью
опции.

поддержка

Новый бэкэнд кеширования позволяет использовать библиотеку pymemcache для memcached. Требуется 3.4.0 или выше. Подробнее см. Документацию по кешированию в Django .

Новые декораторы для админки

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

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

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

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

Создадим свое первое представление¶

Давайте создадим свое первое представление. Откроем файл и добавим следующий код:

polls/views.py

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

Это самое простое представление, которое можно создать на Django. Чтобы вызвать представление, нам нужно назначить его на какой-то URL через конфигурацию URL-ов

Чтобы добавить настройки URL-ов в приложение для голосования, создадим файл . Каталог приложения должен выглядеть следующим образом:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

В файл добавим следующий код:

polls/urls.py

from django.conf.urls import url

from . import views

urlpatterns = 
    url(r'^$', views.index, name='index'),

Следующий шаг – добавить ссылку на в главной конфигурации URL-ов. В«mysite/urls.py« добавим импорт , затем добавим в список . Вы должны получить следующий код:

mysite/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = 
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),

Не совпадает с тем, что у вас получилось?

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

Вы добавили в настройки URL-ов. Давайте проверим, что он работает, запустив команду:

$ python manage.py runserver

Откройте в браузере http://localhost:8000/polls/, вы должны увидеть текст “Hello, world. You’re at the polls index.”, который вы указали в представлении .

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

argument: regex

Термин “regex” обычно используется как короткий вариант “regular expression”(регулярное выражение), который являет шаблоном для распознавания строк, или в нашем случае URL-ов. Django начинает с первого регулярного выражение и идет дальше по списку, сравнивая запрошенный URL с каждым регулярным выражением пока не будет найдено совпадение.

Обратите внимание, регулярные выражения не проверяют GET и POST аргументы, или доменное имя. Например, при запросе на , будет проверяться

При запросе на , так же будет проверяться .

Если вам нужна помощь с регулярными выражениями, почитайте статью в Википедии и документацию модуля . Также книга O’Reilly “Mastering Regular Expressions”, написанная Jeffrey Friedl, просто фантастична. На практике, однако, вам не нужно быть экспертом в регулярных выражениях, т.к. в основном вам нужно знать как составлять простые регулярные выражения. На практике сложные регулярные выражения могу влиять на производительность, по этому не следует полагаться на их широкие возможности.

Замечание о производительности: эти регулярные выражения компилируются при первом импорте модуля с конфигурацией URL-ов. Они работают очень быстро (до тех пор, пока они достаточно просты, как уже замечалось выше).

argument: view

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

argument: kwargs

В представление можно передать предопределенные именованные аргументы. Мы не будет использовать эту возможность в учебнике.

argument: name

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

Изучив основы о запросах и ответах, приступим ко второй части учебника, чтобы начать работать с базой данных.

Расширяем возможности шаблона в Django

Главная сила шаблонов в их способности расширяться. Если задуматься, то на большинстве сайтов есть содержимое, которое повторяется на каждой странице (заголовки, футеры и так далее). Для разработчиков было бы здорово иметь одно установленное место для кода заголовка, которое бы передавалось по наследству каждому шаблону.

Это возможно! Создадим HTML-файл , у которого будет заголовок с ссылками на две созданные нами страницы. Название для файла можно выбрать любое, в данной случае просто стало традицией. Теперь закрываем веб-сервер и затем создаем новый файл.

Shell

(pages) $ touch templates/base.html

1 (pages)$touchtemplatesbase.html

В Django, шаблонный язык для добавления ссылок и базовых логических операций минимален. Ознакомиться со встроенным списком шаблонных тегов можно в . Шаблонные теги оформляются так , где «something» сам по себе является тегом. Вы даже можете создать собственные шаблонные теги.

Для добавления URL-ссылок в проект мы можем использовать , который присваивает себе имя URL паттерна в качестве аргумента. Помните, как мы добавляли опциональные URL названия двум адресам в ? Это было сделано именно по этой причине. Тег использует эти названия для автоматического создания ссылок.

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

Python

<!— templates/base.html —>
<header>
<a href=»{% url ‘home’ %}»>Home</a> | <a href=»{% url ‘about’ %}»>About</a>
</header>

{% block content %}
{% endblock content %}

1
2
3
4
5
6
7

<!—templatesbase.html—>

<header>

<ahref=»{% url ‘home’ %}»>Home<a>|<ahref=»{% url ‘about’ %}»>About<a>

<header>

{%block content%}

{%endblock content%}

Внизу мы добавляем тег-блок под названием . При наследовании, блоки могут быть переписаны дочерними шаблонами. Закрывающему тегу можно дать название — просто напишите . Это может стать хорошей подсказкой при ориентировке в крупных файлах шаблонов.

Python

<!— templates/home.html —>
{% extends ‘base.html’ %}

{% block content %}
<h1>Homepage</h1>
{% endblock content %}

1
2
3
4
5
6

<!—templateshome.html—>

{%extends’base.html’%}

{%block content%}

<h1>Homepage<h1>

{%endblock content%}

и

Python

<!— templates/about.html —>
{% extends ‘base.html’ %}

{% block content %}
<h1>About page</h1>
{% endblock content %}

1
2
3
4
5
6

<!—templatesabout.html—>

{%extends’base.html’%}

{%block content%}

<h1>Aboutpage<h1>

{%endblock content%}

Запускаем сервер с и открываем страницы и вновь. Как видите, на обоих страницах появились заголовки.

Неплохо, правда?

Домашняя страница с заголовком

Страница «About» с заголовком

С шаблонами можно осуществить множество операций. Обычно создается файл а затем в проекте добавляются дополнительные шаблоны которые расширяют базовый файл.

Установка Django через pipenv

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

Shell

$ cd ~/Desktop
$ mkdir django
$ cd django

1
2
3

$cd~Desktop

$mkdirdjango

$cddjango

Теперь используем Pipenv для инсталляции Django.

Shell

$ pipenv install django==3.0

1 $pipenv install django==3.0

Если загляните внутрь нашей папки, то увидите, что в ней появилось два новых файла: и . Теперь у нас есть вся информация, необходимая для создания нового виртуального окружения, однако пока ничего не активировано. Исправим положение через .

Shell

$ pipenv shell

1 $pipenv shell

При работе на Ubuntu вы увидите, что название текущей директории в командной строке взято в скобки. Это значит, что виртуальное окружение активировано. Будучи внутри папки , перед знаком командной строки мы увидим .

Стоит иметь в виду, что из-за в системе Windows, сейчас нет возможности получить визуальное подтверждение об активации виртуального окружения. Однако в следующей секции можно запустить — тогда станет ясно, что виртуальное окружение Django установлено должным образом.

Shell

(django) $

1 (django)$

Все работает! Теперь создаем новый проект Django под названием при помощи следующей команды. Не забудьте в конце поставить точку.

Shell

(django) $ django-admin startproject test_project .

1 (django)$django-admin startproject test_project.

Немного остановимся на причине использования точки (.) в предыдущей команде. Если вы просто запустите то Django по умолчанию создаст следующую структуру:

Структура

Shell

└── test_project
├── manage.py
└── test_project
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py

1
2
3
4
5
6
7

└──test_project

├──manage.py

└──test_project

├──__init__.py

├──settings.py

├──urls.py

└──wsgi.py

Как видите, создается новая директория , в ней файл и еще одна директория . Чувствуется повторение, ведь ранее мы уже создали директорию на рабочем столе и переместились в нее. Будет лучше выполнить команду с точкой на конце. Это нужно для установки в данную конкретную папку — на сей раз результат будет таков:

Структура 

Shell

├── manage.py
└── test_project
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py

1
2
3
4
5
6

├──manage.py

└──test_project

├──__init__.py

├──settings.py

├──urls.py

└──wsgi.py

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

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

Shell

(django) $ python manage.py runserver

1 (django)$python manage.pyrunserver

Мы получим такой ответ:

Shell

Watching for file changes with StatReloader
Performing system checks…

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run ‘python manage.py migrate’ to apply them.

May 05, 2020 — 12:36:09
Django version 3.0, using settings ‘test_project.settings’
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

1
2
3
4
5
6
7
8
9
10
11
12

Watching forfilechanges with StatReloader

Performing system checks…

System check identified no issues(silenced).

You have17unapplied migration(s).Your project may notwork properly untilyou apply the migrations forapp(s)admin,auth,contenttypes,sessions.

Run’python manage.py migrate’toapply them.

May05,2020-123609

Django version3.0,using settings’test_project.settings’

Starting development server athttp127.0.0.18000

Quit the server with CONTROL-C.

При посещении откроется следующая страница:

Приветственная страница Django

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

Shell

(django) $ exit

1 (django)$exit

Вновь активировать виртуальное окружение можно в любое время. — для этого используется команда в терминале.

Если вы сталкиваетесь с виртуальными окружениями впервые, сейчас они могут показаться немного запутанными, но не беспокойтесь — по ходу изучения все прояснится. Базовый принцип строится на установке новых пакетов через , их активации с и выхода через по мере завершения процесса.

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

Создаём представления

Если вы раньше работали с другими фреймворками, то можете удивиться, что в Django нет контроллеров.

Контроллеры содержат логику обработки запросов и возвращения ответов. В традиционной архитектуре MVC есть модель (Model), представление (View) и контроллер (Controller). Примеры MVC фреймворков: Rails (Ruby), Phoenix (Elixir), Laravel (PHP).

Django — это фреймворк MVT. MVT — это модель, представление и шаблон (Template). В Django есть много типов представлений: функции-представления, представления, основанные на классах, и обобщённые представления.

Мы будем использовать обобщённые представления. Наше простое приложение будет:

  • возвращать выборку моделей;
  • создавать новые объекты в базе данных.

С помощью документации можно узнать, что есть представление для возвращения выборки и создания моделей: . Это представление содержит и .

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

Добавьте в файл следующий код:

С помощью трёх строк кода мы создали представление для обработки GET и POST запросов.

Чего ещё не хватает? Маршрутизации URL. Другими словами, нам нужно соединить URL и представления.

Классовые представления в Django

Ранние версии Django поддерживали только функциональные представления (они же представления на основе функции), однако разработчики довольно быстро поняли, что им приходится повторять из раза в раз один и тот же паттерн. Писать представление, которое составляет всех объектов в модели. Писать представление, которое показывает только один детализированный элемент модели. И так далее.

Функциональные представления-генерики были введены для того чтобы избавить разработчиков от этих монотонных паттернов. Однако расширить возможности имеющихся представлений или изменить их должным образом оказалось не так уж просто. В результате в Django появились классовые представления-генерики, которые были легкими в использовании и давали возможность приспосабливать имеющиеся представления под нужны наиболее часто встречающихся случаев.

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

Python

# pages/views.py
from django.views.generic import TemplateView

class HomePageView(TemplateView):
template_name = ‘home.html’

1
2
3
4
5
6

# pages/views.py

fromdjango.views.generic importTemplateView

classHomePageView(TemplateView)

template_name=’home.html’

Ресурсы по Django REST

  • Обзор «Как разрабатывать API при помощи фреймворка Django REST» (How to Develop APIs with Django REST Framework) описывает все шаги по созданию API при помощи Django REST, начиная со среды разработки. В обзоре используется подход под названием «Разработка через тестирование» (test-driven development, TDD).
  • Официальное руководство — это один из лучших источников информации для любого проекта с открытым исходным кодом. Также много полезной информации можно найти на официальном сайте фреймворка.
  • Django: создание REST API — это первая часть великолепной серии статей про данный фреймворк (DRF). Вот остальные части:

    • Знакомимся с DRF (Django REST Framework: Getting Started).
    • Сериализаторы (Django REST Framework: Serializers).
    • Сериализаторы моделей и генераторы представлений (Django REST Framework: ModelSerializer and Generic Views).
    • ViewSet, ModelViewSet и маршрутизаторы (Django REST Framework: ViewSet, ModelViewSet and Router).
    • Аутентификация и разрешения (Django REST Framework: Authentication and Permissions).
    • JSON веб-токены (Django REST Framework: JSON Web Tokens (JWT)).
  • Статья «Как оптимизировать ваши представления Django REST» (How to Optimize Your Django REST Viewsets) дает пошаговую инструкцию (с конкретными примерами), как избежать большого количества ненужных запросов, используя методы  и  в слоях Django ORM.
  • Как сохранить дополнительные данные в сериализаторе Django REST ( How to Save Extra Data to a Django REST Framework Serializer)  — это краткое и удобное руководство для объединения дополнительных данных с уже определенными полями сериализатора DRF перед сохранением всего в базу данных или аналогичным действием.
  • Интерфейс запросов в Django REST Framework (Django polls api using Django REST Framework) — это отличное руководство по созданию серверной части приложения для запросов (пошаговый разбор кода прилагается).
  • Статья «Глубокий разбор классов permission в Django REST Framework» (Django REST Framework Permissions in Depth) содержит примеры кода и объясняет разницу между классами permission и authentication.
  • Оптимизация производительности Django REST Framework (Optimizing slow Django REST Framework performance).
  • Сериализация данных авторизованных пользователей в Django REST Framework (TLT: Serializing Authenticated User Data With Django REST Framework).
  • Создание API и представлений на основе классов с помощью Django REST Framework (Building an API with Django REST Framework and Class-Based Views).
  • Простой вложенный API с использованием Django REST Framework (Simple Nested API Using Django REST Framework)
  • Создание API в Django и Django Rest Framework (Building APIs with Django and Django Rest Framework)

Фронтенд на React

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

Запустите сервер Django и перейдите на http://127.0.0.1:8000/api/lead/ чтобы добавить контакты.

Создадим файл . В нём будет компонент React, запрашивающий и отображающий данные.

Примечание можно написать тот же компонент в виде функции с хуком .

Сохраните и закройте файл. Теперь создайте точку входа для webpack — файл и импортируйте компонент:

;

Теперь можно протестировать результат. Запустите webpack:

Запустите сервер Django:

Перейдите на http://127.0.0.1:8000/. Если вы видите сообщение «Что-то пошло не так», то убедитесь, что применили миграции и заполнили базу данных. Вы должны увидеть данные, отображенные компонентом React.

Выглядит просто. И работает!

Курсы для web-разработчика на Python Django

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

Есть платные и бесплатные онлайн и очные курсы, видеолекции, книги, интернет-ресурсы. Дистанционные курсы длятся от месяца до полугода в зависимости от того, насколько насыщенная программа. Стоит обучение от 15–20 тыс. рублей. Многие онлайн-университеты выдают выпускникам, успешно защитившим дипломную работу, диплом международного образца и помогают в трудоустройстве.

Какими знаниями и навыками должен обладать будущий Django-разработчик

Минимальный пакет знаний junior Django-разработчика включает:

  • основы HTML для web-ресурсов;
  • Python, его структуры данных и библиотеки;
  • jQuery, CSS, Git, IDE или редактор кода;
  • английский язык (нужен для чтения документации, статей), но для начала достаточно уметь читать со словарем.

Будущий Django-разработчик должен развивать коммуникацию, ходить на конференции и прокачивать навык продажи своих умений (это позволит иметь зарплату выше рыночной). По мере накопления опыта крайне желательно изучать смежные отрасли, новые библиотеки.

Что нужно, чтобы стать junior Django:

Какие учебники и пособия будут полезны Django-программисту

Чтобы получить начальное понимание общих методов программирования и языка Python стоит изучить уроки Learn Python the Hard Way (есть на русском языке) или Google’s python class. Learn Python the Hard Way имеет смысл изучать до 42 урока — далее описываются достаточно сложные вещи, которые на начальном уровне не нужны. В Google’s python class желательно делать каждое упражнение, не подсматривая в ответы.

Программисты советуют новичкам книги:

  • Марк Лутц «Изучаем Python» (4-е издание);
  • Марк Лутц «Программирование на Python»;
  • Чед Фаулер «Программист-фанатик»;
  • Билл Любанович «Простой Python»;
  • Бен Форт «Освой самостоятельно SQL»;
  • Ultimate Django (пошаговые уроки по созданию приложения);
  • Джон Дакетт «HTML и CSS. Разработка и дизайн веб-сайтов»;
  • руководство TaskBuster Django Tutorial (на английском);
  • Дэвид Флэнаган «JavaScript. Подробное руководство».

Для начального понимания фреймворка достаточно освоить официальный учебник и документацию. Лучше сделать это дважды, чтобы понять, как взаимосвязаны все части. Легко подана информация на ресурсе Django Girls Tutorial (есть перевод на русский).

Более глубокое понимание Python дадут курсы Udacity’s intro CS class или Unit 1 of MIT’s intro CS course. Эти ресурсы почти взаимозаменяемы. После можно начинать практиковаться в создании простых приложений.

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

Курсы Django Python для начинающих

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

Необходимо сразу найти курс, где минимум 80 % времени уделено практике

Также желательно, чтобы обучение проводил практикующий разработчик уровня не ниже senior.

Как найти подходящий Django-видеокурс в Интернете

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

Для углубленного изучения и понимания сложных тем можно дополнительно находить отдельные видеолекции.

Возможно ли освоить Django Python за 1 час:

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

Теперь, после создания окружения (проекта), мы можем приступить к работе.

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

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

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

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

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

$ python manage.py startapp polls

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

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

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

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

Философия

Модель — это основной источник данных. Он содержит набор полей и поведение данных, которые вы храните. Django следует . Смысл в том, чтобы определять модели в одном месте.

Частью работы с данными также являются миграции. В отличии от Ruby On Rails, например, миграции вынесены из файла моделей и являются просто историей, которую Django может использовать для изменения базы данных в соответствии с текущей структурой моделей.

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

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

polls/models.py

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=)

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

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

Названия каждого экземпляра (например, question_text или pub_date ) это название поля, в “машинном”(machine-friendly) формате. Вы будете использовать эти названия в коде, а база данных будет использовать их как названия колонок.

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

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

может принимать различные необязательные аргументы; в нашем примере мы указали значение для votes` равное 0.

Добавить комментарий

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

Adblock
detector