Django 5 для начинающих

Прогресс по курсу:  9/1004

2.3 Установка Django и создание проекта HelloWorld
6 из 8 шагов пройдено
0 из 6 баллов  получено

Работа с представлениями и адресами.

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

Несмотря на то, что наше новое приложение существует в проекте Django, Django не "знает" о нем, пока мы явно не добавим его в файл Course_FirstProject/settings.py.


В текстовом редакторе откройте этот файл и прокрутите ниже до INSTALLED_APPS, где вы увидите шесть встроенных приложений Django. Добавим blog.apps.BlogConfig в самый низ:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig' # наше новое приложение
]


Что такое BlogConfig, спросите вы? Это название единственного подкласса AppConfig в файле blog/apps.py на данный момент, которая автоматически была создана. Давайте откроем файл и проверим:

from django.apps import AppConfig


class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'

Также мы можем указывать в INSTALLED_APPS просто название нашего приложения, в нашем случае это blog:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog'
]

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

 

Добавление Hello, World

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

  • models.py

  • views.py

  • template.html (HTML файл шаблона)

  • urls.py


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


Поэтому следующим шагом будет создание нашего первого представления. Начнем с обновления файла views.py в нашем приложении blog, чтобы он выглядел следующим образом:

blog/views.py:

from django.http import HttpResponse


def homepageview(request):
    return HttpResponse("Hello, World!")


По сути, мы говорим, что всякий раз, когда вызывается функция представления homepageview, возвращаем текст Hello, World!.

Более конкретно, мы импортировали встроенный метод HttpResponse, чтобы мы могли вернуть пользователю объект ответа.

Мы создали функцию homepageview, которая принимает объект запроса и возвращает ответ со строкой Hello, World!.


В Django существует два типа представлений: представления на основе функций (FBV) и представления на основе классов (CBV). Наш код в этом примере представляет собой представление на основе функций: оно относительно простое в реализации и явное.

Django изначально начинался только с FBV, но со временем были добавлены CBV, которые позволяют намного больше повторного использования кода, сохраняют принцип DRY(Don't-Repeat-Yourself), и могут быть расширены с помощью миксинов. Дополнительная абстракция CBVs делает их довольно мощными и лаконичными, однако это также делает их более сложными для чтения новичками в Django.

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

Таким образом, технически существует три способа написания представления в Django: представления на основе функций (FBVs), представления на основе классов (CBVs) и общие представления на основе классов (GCBVs). Эта настройка полезна для опытных разработчиков, но сбивает с толку новичков.

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


Далее нам нужно настроить наши URL-адреса. Создайте новый файл urls.py в приложении blog. Затем обновите его следующим кодом:

blog/urls.py:

from django.urls import path
from .views import homepageview

urlpatterns = [path("", homepageview, name="home"), ]


В верхней строке мы импортируем функцию path из Django, для создания нашего шаблона URL, а в следующей строке мы импортируем наши представления.

Ссылаясь на файл views.py как на .views, мы говорим Django искать в текущей директории файл views.py и импортировать оттуда представление homepageview.


Наш шаблон URL состоит из трех частей:

  1. Регулярное выражение Python для пустой строки ""

  2. Ссылка на представление под названием homepageview

  3. Необязательный именованный шаблон URL с именем home

Другими словами, если пользователь запрашивает домашнюю страницу, представленную пустой строкой "", Django должен использовать представление под названием homepageview. Более подробнее с диспетчером URL мы познакомимся в следующем разделе.


На этом мы почти закончили. Последний шаг - это обновление нашего файла Cource_FirstProject/urls.py.

Обычно в рамках одного проекта Django существует несколько приложений, например, страницы, и каждому из них нужен свой собственный путь URL.

Cource_FirstProject/urls.py:

from django.contrib import admin
from django.urls import path, include  # new

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("blog.urls")),  # new
]


Новый шаблон URL-адреса, определенный с помощью функции include, ссылается на шаблоны URL-адресов, определенные в приложении blog, что-бы они были включены в рамки пути корневой директории сайта /. Указанные шаблоны вставляются в рамки именного пространства blog.

Теперь каждый раз, когда пользователь заходит на домашнюю страницу, он будет сначала перенаправляться в приложение blog, а затем в представление homepageview, заданное в файле blog/urls.py. Именные пространства должны быть уникальными для всего проекта. Подробнее о пространствах имен для URL-запросов мы поговорим в следующих разделах.

Необходимость в двух отдельных файлах urls.py часто сбивает с толку новичков. Думайте о верхнем уровне Cource_First_Project/urls.py как о шлюзе к различным шаблонам url, характерным для каждого приложения.

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

# Windows

python manage.py runserver

# macOS

python3 manage.py runserver


Откройте в браузере http://127.0.0.1:8000/ и там появится Hello, World!, а не дефолтная страница Django:


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

Если у вас возникли трудности, вы можете клонировать проект с гитхаба - https://github.com/Permin0ff/Cource_FirstProject


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

 

название ф-ии представления ранее по тексту было записано полностью маленькими буквами "homepageview"

@Артем_Ефимов, спасибо, поправил.

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

@Нарбеков_Марсель, Попробуйте PyCharm, он автоматически сохраняет, и у VSC тоже вроде есть такая функция.

@Илья_Перминов, Да, она точно должна быть, я вроде ее даже отключал, т.к. она мне в какой-то момент времени мешала сильно, но видимо лучше вернуть)

если кому-то понадобится

Изменен Нарбеков Марсель

У меня все работает как надо, но хотел спросить, нормально ли что на этом этапе я понимаю только 30-40% информации? Или может нужна еще какая-то дополнительная база, чтобы понимать что происходит? Потому что пока я просто неосознанно копирую код

@Daniil_Nagapetyan, нормально, так всегда при освоении чего-то нового.
Дополнительная база не нужна, просто проходите курс, при решении задач и создании проектов станет понятнее.

@Дмитрий_Селезнев, хорошо, спасибо что успокоили))


Новый шаблон URL-адреса, определенный с помощью функции include, ссылается на шаблоны URL-адресов, определенные в приложении blog, что-бы они были включены в рамки пути blog/. Указанные шаблоны вставляются в рамки именного пространства blog.

Этот текст некорректный, path blog/ не используется в вашем коде. 

@Sergey_Udachin, спасибо, исправил.

В верхней строке мы импортируем path из Django для питания нашего шаблона URL

Возможно имелось ввиду "подключения".

@CodeNull, спасибо, исправил.

Здравствуйте, спасибо за обновление курса.

В предыдущей версии курса, вроде обсуждали изменение названия данной функции (здесь и далее по тексту) в части отсутствия в названии заглавных букв в стиле соглашения Python:

@Максим_Михеев, Спасибо поправили.

@Максим_Михеев, А по поводу вопроса из диспетчера URL. Ту задачу переместили в другой раздел, так как еще не рассматривали данную функцию. Если что ответ будет - http://127.0.0.1:8000/designtest/, так как нет слеша в конце главного файла маршрутов, и при инклюде они сложатся. При условии, что в design.urls содержится:

urlpatterns = [path("test/", views.index, name="index"), ]

@Илья_Перминов, Теперь понятно как это работает, я думал через отдельный слеш складываются, а они просто склеиваются в одно значение. Спасибо.

@Максим_Михеев, через слеш путь сложится, а без слеша строка.

@Илья_Перминов, В любом случае, это ведь будет рабочий URL? И по условию задачи ошибки не возникнет? Теоретически ведь могут существовать оба шаблона?

@Максим_Михеев, он будет рабочий, только управлять таким шаблоном не очень удобно, так как путь будет складываться. Правильнее когда например путь accounts/ идет в приложение аккаунтов, путь blog/ к приложению блог и тд.

@Илья_Перминов, Да, это я понял, чтобы от основного шлюза (urls проекта), можно было пробрасывать к второстепенным (urls приложений) и соответственно там уже делить по разным маршрутам, что конечно же подразумевает слеш в конце пути url основного шлюза. 

Спасибо вам за пояснения и уточнения. 

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

@Максим_Михеев, Спасибо, очень приятно слышать, мы и дальше планируем его развивать.

@Илья_Перминов, Подскажите еще пожалуйста:

- когда по срокам планируете открыть 10  модуль - Создание блога 2.0?

- во втором курсе так же идут усовершенствования дополнения и обновления?

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

Вопрос по поводу указания 'blog' в списке INSTALLED_APPS 

Решил проверить, что будет, если удалить 'blog' из этого списка. Закомментил его, и судя по всему, в работе приложения blog ничего не изменилось. Все также выводится Hello, World! из blog/views.py

Но ведь что-то должно было поменяться?

@Игорь_Новиков, это скорее всего из-за того что в этом проекте нет моделей.

Извините ,

делаю всё так же , как написано в курсе

но моя страничка имеет самый начальный вид и не хочет двигаться с места (

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

@Данила_Румянцев, Проверяйте еще раз полностью код из этого раздела. Если так и не получится найти ошибку, то загружайте архив проекта по адресу https://mega.nz/filerequest/rANtUqzWHQ4, я посмотрю и подскажу вам.

Добрый день Дело не конкретно в этом разделе Даже самый базовый проект , по типу hello world и этого курса не получается ( Просто выводится базовая страничка django и всё Мелял язык с английского на русский , и даде эта настройка не проходит Делал так , что бы не показывались ошибки Результат тот же - без изменений (

@Данила_Румянцев, загрузите свой проект hello world, я посмотрю.

@Данила_Румянцев, Как загрузите, отпишитесь только.

@Данила_Румянцев, в данном проекте редактируются только 4ре файла, проверьте их:

1. Course_FirstProject/settings.py: необходимо добавить приложение(в данном случае blog) в INSTALLED_APPS.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog', # new
]


2. blog/views.py: необходимо добавить код функции-представления homepageview.

from django.http import HttpResponse

def homepageview(request):
    return HttpResponse("Hello, World!")


3. blog/urls.py: необходимо создать данный файл и добавить в него маршрут для функции-представления homepageview.

from django.urls import path
from .views import homepageview

urlpatterns = [path("", homepageview, name="home"), ]


4. Cource_FirstProject/urls.py: необходимо подключить в нём маршруты приложения blog (blog/urls.py).

from django.contrib import admin
from django.urls import path, include  # new

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("blog.urls")),  # new
]


Проект можно создавать без PyCharm, достаточно командной строки, например:

C:\Users\Dmitry>cd C:\Project

C:\Project>mkdir Cource_FirstProject

C:\Project>cd Cource_FirstProject

C:\Project\Cource_FirstProject>python -m venv venv

C:\Project\Cource_FirstProject>.\venv\Scripts\activate.bat

(venv) C:\Project\Cource_FirstProject>pip install django==4.2.8

(venv) C:\Project\Cource_FirstProject>django-admin startproject Cource_FirstProject .

(venv) C:\Project\Cource_FirstProject>python manage.py migrate

(venv) C:\Project\Cource_FirstProject>python manage.py startapp blog

(venv) C:\Project\Cource_FirstProject>python manage.py runserver
Я уверен в пнавильности написания проекта , возможно , дело в консольных командах , которые я не вводил Venv или Activate.bat ? Я пишу не в pycharm , а в vscode Может , дело в этом ?

@Данила_Румянцев, я не в курсе как в VSCode создается виртуальная среда. Никогда в нем не работал. Дмитрий выше скинул команды для создания проекта не используя редактор кода. Можете воспользоваться следующей инструкцией https://code.visualstudio.com/docs/python/tutorial-django

@Данила_Румянцев, если отображается начальная страница Джанго, то это означает что проект работает и причины нужно искать в своём коде.