Заметки по создание блога на 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

{% 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 %}

После этих действий мы получим форматированный список наших статей.

django-techbook-01