Приветствую сообщество, встала передо мной задача написать социальную сеть. А коль скоро язык программирования, которым я более-менее владею — это Python, я выбрал фреймворк Django для реализации проекта. Чтобы не тратить время на написание HTML шаблонов и CSS стилей, эти файлы я беру в интернете с пометкой Free. В основном это шаблоны от Colorlib.

Поехали.

Сразу оговорюсь, что использую PyCharm, поэтому могу не знать все команды из файла manage.py.

После создания проекта в среде, как и в любом Django проекте, первое, что необходимо сделать — внести изменения в файле settings.py а именно:

  1. Меняем две переменные на

    LANGUAGE_CODE = 'ru-ru'
    TIME_ZONE = 'Ваш часовой пояс/Ваш город' #Например: Europe/Moscow
    
  2. Добавить папку для статических и медиа файлов

    # Static files
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    
    # Media files
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Далее создаём своё приложение командой

python manage.py startapp my_app

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

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

INSTALLED_APPS = [
    'django.contrib.admin',
    ...
    'django.contrib.staticfiles',
    'my_app',#наше приложение
]

Далее необходимо определить url адрес для нашего приложения, что тоже является хорошим тоном разработки. В папке приложения (не путать с папкой проекта) нужно предварительно создать файл urls.py. А затем в папке проекта в файле urls.py импортируем функцию include и прописываем адрес. Об этом также написано в комментариях в самом файле.

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('account.urls'))
]

Если на этом этапе мы запустим сервер командой

python manage.py runserver

в командной строке (в PyCharm кнопка «Запуск» или «Debug»), то получим ошибку, ведь в папке приложения файл urls.py (далее — account/urls.py) пустой.

Заполним его следующим кодом.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='login'),# при обращении к адресу ''(главная страница), будем использовать представление (термин Django) log
]

Теперь выйдет ошибка, потому что account/views.py пустой. Исправим.

from django.shortcuts import render #импорт функции
# Create your views here.
def index(request):#создаем свою функцию
    context = {}#с помощью словаря можем передать модель и форму в шаблон HTML
    return render(request, 'my_app/index.html', context)#собственно вызываем шаблон HTML

Почти готово. Что уже сделано:

  1. Создано приложение в проекте.
  2. Внесены изменения в настройках.
  3. Прописан адрес в главном urls.py проекта.
  4. В приложении создан файл urls.py и в нем прописано представление (views).
  5. В представлении (views) создана функция обработки url адреса и HTML шаблона.

Пора создать шаблон.

При создании проекта у нас автоматически создаётся папка 'templates', в ней нужно создать папку my_app, внутри my_app создать файл index.html. Для проверки в теге body можно записать:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Заголовок</title>
</head>
<body>
    <h2>Сайт работает.</h2>

</body>
</html>

и можно запускать сервер.

В итоге мы должны увидеть вот это (изображение):

image

Если на сайте используются какие-либо CSS стили или JavaScript файлы, а это 10 из 10 случаев, то нужно их подгрузить перед строкой DOCTYPE командой

{%load staticfiles%}

При этом в папке приложения создать папку «static», внутри держать CSS, JS и тд. А в HTML шаблоне в теге link параметре href указать абсолютный путь к файлу, например:

<link href="{% static 'css/style.css' %}" rel="stylesheet">

Итого, файл будет выглядеть вот так:


{%load staticfiles%}
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Заголовок</title>
    <link href="{% static 'css/style.css' %}" rel="stylesheet">
</head>
<body>
    <h2>Сайт работает.</h2>

</body>
</html>

В общем-то нам этом введение и заканчивается. Дальше все действия будут похожи, только суть будет разной. Будут разные формы (тег form в HTML) в файле forms.py приложения (нужно предварительно создать этот файл), будет разная логика приложений, описанная в views.py, ну и модели в базе данных, описанные в models.py. Но сам алгоритм действий тот же самый

  1. Создаём адрес.
  2. Создаём представление (логику).
  3. Создаём HTML шаблон.
  4. Связываем всё вместе.

+ — пара промежуточных действий в виде форм и моделей.

В блоге Metanit (ссылка внизу) хорошо описана суть Модель — Шаблон — Представление, копипастить не собираюсь, там же есть теория и про формы, и про модели.

В «Руководство Django Girls» (ссылка внизу) можно узнать подробней о расширении шаблонов HTML (крайне полезная фишка Django), о создании учётной записи администратора, о добавлении данных в созданные модели.

А я на этом заканчиваю. В следующей части будет код создания формы регистрации на сайте, а чтобы не мусорить на Хабре, дам ссылку на гитхаб. Успехов в главном, товарищи.

Ссылки на полезные ресурсы:
Блог про Django — Metanit
Руководство Django Girls
Django в примерах

Комментарии (33)


  1. ZaEzzz
    08.08.2019 19:31
    +3

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


    1. Joseph_Parker Автор
      09.08.2019 09:37

      Вы про эту документацию django.fun/docs/ru/2.2?
      И если возможно, дайте ссылку на тутор, о котором пишете.
      З.Ы. у меня версия 2.2.4


      1. turbidit
        09.08.2019 10:01

        Есть довольно актуальная книга: Django 2.1. Практика создания веб-сайтов на Python


        1. Joseph_Parker Автор
          09.08.2019 10:04

          У меня другая от этого же автора. Там пример интернет-магазина. Но и этот учебник гляну, спасибо.


      1. ZaEzzz
        09.08.2019 12:17

        Это такой толстый троллинг или что?
        По ссылке же тутор есть.


        1. Joseph_Parker Автор
          09.08.2019 12:31

          Точно не троллинг, вот прям 100%
          Просто не сразу дошло, что, когда вы писали про тутор, имели ввиду одну/несколько ссылку/ок, оставленных мной.

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


          1. ZaEzzz
            09.08.2019 12:44

            Я имел в виду тутор из документации джанги — его нет в статье.
            Если честно, у меня такое жесткое негодование — человек, который не знает фреймворк пишет статью о том как с ним работать. Кроме этого, человек даже не удосужился прочитать даже начало официальной документации, а там прямо сразу «First steps», где вот прямо вообще качественно все описано и разжевано.

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


            1. Joseph_Parker Автор
              09.08.2019 13:32

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

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

              Как говорится, «Не согласен — критикуй, критикуешь — предлагай, предлагаешь — делай». Поэтому предлагаю вам, не в ущерб вашей работе и интересам, написать вводную статью для новичков (выжимку, суть документации). Возможно с минимальными объяснениями и ссылками, где можно прочитать подробней.
              Как только это сделаете, я удалю свою «статью» за ненадобностью.

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


              1. ZaEzzz
                09.08.2019 14:26

                Неужели все прямо настолько нужно разжевывать…

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

                Не нужно искать ответы в блогах. Или еще хуже в видеоблогах, если такое было.
                Форумы, книги, учебники. Скорее всего непонятные вещи относились к питону — учебник в руки.

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

                Проблема в том, что это нужно вам, а не сообществу. Решит сотня таких людей пойти подобным путем и ресурс превратиться в свалку «как с написал хеллоу ворлд» по документации.

                Как говорится, «Не согласен — критикуй, критикуешь — предлагай, предлагаешь — делай».

                Критикую. Предлагаю убрать этот опус. Был бы рубильник — убрал.
                Да, вы если критикуете, то обязательно что-то делаете лучше? К примеру, после просмотра фильма вместо отзыва и критики вы снимаете свой и лучше?
                В общем, так себе фразочка.

                А вообще я запилил эту «статью» по той причине, что не все могут читать на английском, переводчик не всегда корректно работает

                … и вообще народ не умеет пользоваться гуглом. Быстрогугл нашел это djbook.ru/rel1.9/intro/index.html

                Как только это сделаете, я удалю свою «статью» за ненадобностью.

                Ссылка выше намекает на удаление.

                Повторюсь:
                помогает лично мне в обучении

                Лично ваше обучение никого не волнует, а писать опусы с вредными советами не стоит, тем более без вычитки.

                P.S. А вот эти куски мне напомнили видеоролик «почему так сложна».
                описание было написано «сложным» языком.

                написаны сложным языком


                1. Joseph_Parker Автор
                  09.08.2019 15:19

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

                  Да, вы если критикуете, то обязательно что-то делаете лучше? К примеру, после просмотра фильма вместо отзыва и критики вы снимаете свой и лучше?
                  Раз уж вы увидели здесь раздачу вредных советов и действительно можете сделать лучше, почему бы не сделать это. Напишите своё руководство, чем «кидаться» ссылками. Или сделайте обзор где и что можно прочесть годного.

                  Лично ваше обучение никого не волнует
                  Согласен.

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


                  1. ZaEzzz
                    09.08.2019 16:02

                    Раз уж вы увидели здесь раздачу вредных советов и действительно можете сделать лучше, почему бы не сделать это.

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

                    Да, если даже такое случится и я смогу написать что-то ценнее того, что уже написано, то все равно будут авторы, которые не будут пользоваться поиском и в комментариях продолжат отвечать «сделай лучше».
                    Интересно, чем ваш пост лучше этого старого поста?
                    habr.com/ru/post/181556

                    Напишите своё руководство, чем «кидаться» ссылками.

                    Шикарный перевод пошагового тутора с из официальной документации фреймворка с разжевываниями — даже это не осилили?

                    Или сделайте обзор где и что можно прочесть годного.

                    Хабрапоиск в помощь — тут много таких статей что и где почитать.


                    1. Joseph_Parker Автор
                      09.08.2019 16:26

                      Отлично, задействую в поиске инфы и «Хабрапоиск» и другие ресурсы, на которые вы указали. Спасибо.

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


                      1. ZaEzzz
                        09.08.2019 16:45

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


                        1. Joseph_Parker Автор
                          09.08.2019 16:49

                          Да.


  1. resetme
    08.08.2019 23:36

    За место:
    {%load staticfiles%}
    Принято писать:
    {% load staticfiles %}
    Мелочь, но так принято у профи.


    1. Shtucer
      09.08.2019 05:33

      Вместо "за место" принято писать "вместо". Мелочь, но так принято. %)


      1. resetme
        09.08.2019 07:43

        Не везде русский язык одинаковый на всей обширной территории России и ближайших стран.


        1. Shtucer
          09.08.2019 07:45
          +1

          Это, пожалуй, самое нелепое оправдание, что я видел.


          1. resetme
            09.08.2019 08:44

            Вообще-то я не оправдывался, а доводил до вашего сведения.


    1. rSedoy
      09.08.2019 05:46

      staticfiles из старых версий, привыкайте писать

      {% load static %}


      1. resetme
        09.08.2019 07:40

        А зачем мне привыкать? Я только показал code style, а не сами библиотеки. У человека может быть масса legacy код.


        1. rSedoy
          09.08.2019 08:43

          раз решили поправить, поправьте это место полностью, ну и path намекает что это не legacy


          1. resetme
            09.08.2019 08:52

            Тогда бы человек не понял о чем это я. А staticfiles можно спокойно использовать до Django 3. Депрекейтед код не значит, что он не работает.


      1. Joseph_Parker Автор
        09.08.2019 09:43

        Понял, принял. Кстати, только что глянул в документацию, там так же написано. Видимо, я на одном из форумов «подхватил» staticfiles.
        З.Ы. у меня версия 2.2.4


    1. resetme
      09.08.2019 07:54
      +1

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


      1. Nikobraz
        09.08.2019 10:48

        раз уж началась такая заварушка: "-тся"


        1. resetme
          09.08.2019 11:03

          Очень ценное замечание.


  1. ali_aliev
    09.08.2019 09:28

    TIME_ZONE = 'Ваш часовой пояс/Ваш город' #Например: Europe/Moscow


    Плохая практика, на сервере лучше использовать UTC, а на клиенте уже преобразовывать в local time.


    1. Joseph_Parker Автор
      09.08.2019 09:45

      При загрузке проекта на сервер лучше сделать так:

      TIME_ZONE = 'UTC

      Это я учту.

      А как преобразовать в local time не подскажете? (ссылку, текст, видео — что угодно)



  1. nomhoi
    09.08.2019 12:33

    Как масштабироваться собираетесь?


  1. variable
    11.08.2019 20:46

    Первое что нужно сделать
    если рендеришь шаблоны на сервере. Если джанга используется как АПИ сервер то бойлерплейт немного другой.