Пример создания простого сайта в Django

Добавлено: 09/06/2019 18:11 |  Обновлено: 28/12/2022 09:31 |  Добавил: nick |  Просмотры: 48596 Комментарии: 6
Вводная часть
В материале описываются основные приемы работы с Python-фреймворком Django. Изложение ведется на примере создания простого проекта на Django. Проект представляет собой электронный журнал со списком записей или тем. Каждая запись в свою очередь может также содержать вложенные записи или заметки. Для создания/редактирования/удаления записей и пользователей используется готовая админ-панель Django. В данном проекте ограничением для пользователей является то, что они могут создавать записи только от своего имени.
В материале 3 раздела: в первом описывается процесс создания законченного проекта на Django, в принципе, для понимания основ работы с фреймворком на нем можно и остановиться. Последующие 2 добавляют стили и описывают некоторые дополнительные приемы работы с пользователями.

Пример создания более сложного сайта на Django вы можете найти на моем сайте, посвященном языку Python - python.phpnick.ru
Видеоверсия (Django 4.1). Является больше дополнением и перед просмотром лучше ознакомиться с текстом.

Содержание:

  1. Создание проекта
  2. Добавление стилей
  3. Работа с пользователями

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

Создадим папку с названием проекта, например log. В этой папке нужно создать виртуальное окружение. Для этого воспользуемся командой:
python -m venv log_env
После чего созданное виртуальное окружение нужно активировать, для этого в разных ОС используются разные команды.
Для Linux и OS X:
source log_env/bin/activate
Для Windows:
log_env\Scripts\activate
Далее нужно установить фреймворк в это виртуальное окружение, с помощью команды:
pip install Django
После того как Django установится, создадим новый проект с помощью команды:
django-admin.py startproject log
После этого будет создана новая папка log, в которую надо перейти. Внутри нее вы увидите файл manage.py. Этот файл мы будем использовать очень часто, на всем протяжении работы с проектом.

Можно сразу попробовать запустить встроенный в Django веб-сервер с помощью команды:
python manage.py runserver
(надеюсь, перед тем как запускать эту команду вы не забыли перейти в папку log/log, там, где вы видите файл manage.py) Если после запуска сервера вы откроете браузер, и перейдёте по адресу localhost:8000, то вы должны увидеть приветственную страницу Django. Если страница у вас открылась, значит все в порядке и можно продолжать.

Для хранения записей на сайте нужна БД, на данный момент у нас уже есть sqlite-БД, которая находится в файле db.sqlite3 (рядом с файлом manage.py). Но пока что она пустая, поэтому теперь создадим таблицы в БД, которые потребуются для работы нашего проекта с помощью команды:
python manage.py migrate
Так как проект на Django должен состоять из различных приложений (apps), то теперь нам нужно создать новое приложение в нашем проекте, назовем его logs. Делается это с помощью команды:
python manage.py startapp logs
После чего папка проекта (log/log) будет иметь следующее содержимое:
log/log
|-- log
|-- logs
|-- db.sqlite3
|-- manage.py
Получается, что у нас целых 3 папки log, одна в другой, как в матрёшке. И есть еще папка с названием logs. Постарайтесь не запутаться в них, потому что в дальнейшем нам придется работать отдельно в каждой из них, и очень важно не перепутать в какой что делать.

Чтобы Django узнал о существовании вновь созданного приложения logs, в файле settings.py (папка log/log/log) найдите список INSTALLED_APPS, и добавьте новый элемент с названием приложения – logs. Должно получиться вот так (добавленная строчка выделена жирным):
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'logs',    
] 

Модель (Model)
Добавим модели Topic и Entry в файл models.py (папка log/log/logs). Модели будут содержать описания о том, какие данные будут храниться в БД-таблицах нашего проекта.

Откроем файл models.py и добавим туда следующее содержимое:
from django.db import models

class Topic(models.Model):
	text = models.CharField(max_length=200)
	date_added = models.DateTimeField(auto_now_add=True)

	def __str__(self):
		return self.text

class Entry(models.Model):
	topic = models.ForeignKey(Topic, on_delete=models.PROTECT)
	text = models.TextField()
	date_added = models.DateTimeField(auto_now_add=True)

	class Meta:
		verbose_name_plural = 'entries'	

	def __str__(self):
		return self.text[:50] + "..." 
Таблицы моделей Entry и Topic имеют связь один-ко-многим. То есть у каждой основной записи или темы (Topic) может быть много вложенных (Entry).

Теперь осталось создать файл миграции для добавленных моделей и создать новые таблицы в БД на основе этих миграций. Делается это с помощью 2-х команд:
python manage.py makemigrations logs
python manage.py migrate

Создание суперпользователя
Чтобы попасть в админ-панель Django (http://localhost:8000/admin) нужно создать нового пользователя. Делается это командой:
python manage.py createsuperuser
При создании суперпользователя укажите имя пользователя, email (можно не указывать) и пароль.

После добавления нового пользователя можно попробовать войти в админ-панель Django. Если у вас всё получится, то вы должны увидеть следующую картинку: Здесь вы видите таблицу с 2-мя строчками для работы с группами пользователей (Groups) и с самими пользователями (Users). Для того, чтобы мы здесь могли работать с нашими моделями, их нужно зарегистрировать в файле admin.py (log/log/logs). Откроем файл и добавим в него следующий код:
from django.contrib import admin
from logs.models import Topic, Entry

admin.site.register(Topic)
admin.site.register(Entry) 
После этого обновите страницу админ-панели и вы должны увидеть 2 новые строчки: Entries и Topics.
Маршруты (urls)
Нам нужно добавить маршруты, по которым запросы от браузера будут открывать нужные страницы сайта. Для этого следует отредактировать 2 файла с одинаковым названием urls.py, это файл urls.py для всего проекта в целом (папка log/log/log) и для отдельного приложения logs (папка log/log/logs). В папке приложения logs файла urls.py нет, его нужно создать самостоятельно.

Для начала откроем файл urls.py проекта (папка log/log/log). И в список urlpatterns добавим новую строчку (выделена жирным):
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('logs.urls', namespace='logs')),
] 
Чтобы не было ошибки нужно в строчку (выше списка urlpatterns):
from django.urls import path
добавить импорт метода include(). После чего эта строчка будет выглядеть следующим образом:
from django.urls import path, include
Далее создадим файл urls.py в папке приложения (папка log/log/logs). Его содержимое должно быть таким:
from django.urls import path

from . import views
app_name = 'logs'

urlpatterns = [
	path('', views.index, name='index'),
	path('topics/<int:topic_id>/', views.topic, name='topic'),
]
Здесь, в методе path() первым параметром идет url страницы на сайте, 2-й параметр – это метод в файле views (в данном случае index или topic), который должен обрабатывать пришедший запрос от посетителя сайта, 3-й параметр – это произвольное имя данного маршрута, которое может применяться в дальнейшем для обращения к этому маршруту.

Если интересно, то определение метода path() в документации выглядит следующим образом: path(route, view, kwargs=None, name=None)
Представление (View)
Представление в Django – это контроллер в других фреймворках. Представление получает информацию от модели и отдает её в шаблон (template), который, в свою очередь, нужен для размещения переданной ему информации на html-странице. Класс представления – views.py можно найти в папке приложения logs (log/log/logs). Добавим в него 2 метода из маршрутов, которые мы добавили выше, в файле urls.py приложения (index() и topic()). В результате его содержимое должно быть следующим:
from django.shortcuts import render
from .models import Topic

def index(request):
	topics = Topic.objects.order_by('-date_added')
	context = {
		'topics': topics,
	}
	return render(request,
		'logs/index.html', context)

def topic(request, topic_id):
	topic = Topic.objects.get(id=topic_id)
	entries = topic.entry_set.order_by('-date_added')
	context = {
		'topic': topic,
		'entries': entries,
	}
	return render(request,
		'logs/topic.html', context)
В обоих методах мы видим метод render(). Он использует html-файлы для вывода полученных из модели данных на страницу в браузере. Это и есть шаблоны. Всего нам нужно будет их 3 штуки, один общий (base.html), который будут наследовать 2 других. Первый (index.html) – для вывода списка основных записей или тем (topics), второй (topic.html) – для вывода какой-то определенной темы, и списка вложенных в нее заметок/записей (entries).

Шаблон (Template)
Для того чтобы добавить нужные нам шаблоны в папке приложения logs (log/log/logs) создадим папку templates, а внутри нее папку с названием приложения logs. Затем внутри папки logs создадим 3 файла: base.html, index.html и topic.html. Содержимое файлов представляет html-код с включениями Django-директив. Особо выпендриваться с html-разметкой я не стал, чтобы не усложнять материал, но вы, конечно, можете сделать всё по-своему.

Содержимое файла base.html следующее:
<p><a href="{% url 'logs:index' %}">
	Журнал записей
</a></p>
{% block content %}{% endblock content %} 
Вначале выводится ссылка на индексную страницу сайта, обратите внимание, чтобы создать ссылку здесь используется имя маршрута index, которое мы указали ранее в файле urls.py. Между Django-директивами {% block content %} и {% endblock content %} будет включено содержимое из 2-х других шаблонов (index.html и topic.html).

Содержимое файла index.html следующее:
{% extends 'logs/base.html' %}

{% block content %}

	<h3>Темы:</h3>

	{% for topic in topics %}
		<p>
			<strong>
				<a href="/topics/{{ topic.id }}/">
					{{topic.text}}
				</a>
			</strong>
			(Дата создания: {{topic.date_added|date:'H:i d/m/Y'}})
		</p>
	{% empty %}
		<p>Пока нет тем</p>	
	{% endfor %}

{% endblock content %} 
Содержимое файла topic.html следующее:
{% extends 'logs/base.html' %}

{% block content %}

	<h3>Тема: {{topic}}</h3>

	{% for entry in entries %}
		<p>
			{{entry.text|linebreaks}}
			(Дата создания: {{entry.date_added|date:'H:i d/m/Y'}})
		</p>
	{% empty %}
		<p>Пока нет записей</p>	
	{% endfor %}

{% endblock content %} 
Теперь в браузере на индексной странице (http://localhost:8000/) можно увидеть следующую картинку: Добавить темы (topics) и вложенные записи (entries) можно через админку Django.
К содержанию

Оставьте свой комментарий

Комментарии