Заметки по создание блога на Django
Базовый пакет будем далее называть пакетом конфигурации. Он расположен по адресу /var/www/wt.roror.ru/techbook
- Создаем новое приложение: bboard
manage.py startapp article
- Регистрируем его в файле настроек приложения по адресу: /var/www/wt.roror.ru/techbook/settings/base.py
INSTALLED_APPS = [
'home',
'search',
'article',
- Создание контроллера - кода, запускаемого в ответ на поступление клиентского запроса, который представляет собой интернет ссылку. В данном случае это https://wt.roror.ru/articles Код контроллера помещен в файле /var/www/wt.roror.ru/article/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
from .models import ArticlePage
def index(request):
template = loader.get_template('article/index.html')
aps = ArticlePage.objects.order_by('-post_date')
context = { 'aps': aps}
return HttpResponse(template.render(context, request))
Имя функции - index. В качестве параметра традиционно применяется request.
- Теперь надо привязать обработку функции index при открытии ссылки https://wt.roror.ru/articles Для этого необходимо создать маршрут в файле urls.py пакета конфигурации /var/www/wt.roror.ru/techbook/urls.py
urlpatterns = [
...
path('articles', include('article.urls')),
...
Это универсальный маршрут, который вызывает вложенный маршрут на уровне приложения articles - /var/www/wt.roror.ru/article/urls.py
from django.urls import path
from .views import index
urlpatterns = [
path ('', index),
]
Это локальный маршрут уровня приложения уже вызывает по "корневой" ссылке ('') нашу функцию (контроллер) - index.
-
Теперь надо позаботиться о представлении выходных данных. По нашей ссылке мы дожны получить оформленный список наших статей. Для этого будем использовать модель. Модель описывает структуру данных и дает простой интерфейс для использования этих данных. Модель класса ArticlePage описана в файле /var/www/wt.roror.ru/article/models.py
... from django.db import models ... class ArticlePage(Page): main_image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) post_date = models.DateField("Post date") intro = models.CharField(max_length=250) ### body = RichTextField(blank=False) body = StreamField([ ##('heading', blocks.CharBlock(classname="full title")), ('paragraph', blocks.RichTextBlock()), ('code', blocks.RawHTMLBlock()), ('table',TableBlock()), ('image', ImageChooserBlock()), ('markdown', MarkdownBlock(icon="code")), ]) src_url = models.URLField(null=True, blank=True) rel_url = models.URLField(null=True, blank=True) tags = ClusterTaggableManager(through=ArticlePageTag, blank=True) categories = ParentalManyToManyField('article.ArticleCategory', blank=True) section = models.ForeignKey(Section,null=True,blank=True,on_delete=models.SET_NULL,related_name='+')
-
После этого, нам останется только подготовить шаблон для гибкого и красивого вывода необходимой информации. Он упоминался нами в контроллере: template = loader.get_template('article/index.html') Вот листинг шаблона /var/www/wt.roror.ru/article/templates/article/index.html
```python {% extends "base.html" %} {% block content %} <!DOCTYPE html> {% for ap in aps %} <div> <h5>{{ ap.title }}</h5> <p>{{ ap.intro }}</p> <p>{{ ap.post_date|date:"d.m.Y" }}</p> </div> {% endfor %} {% endblock %} ```
-
После этих действий мы получим форматированный список наших статей.