Заметки по создание блога на Django

Базовый пакет будем далее называть пакетом конфигурации. Он расположен по адресу /var/www/wt.roror.ru/techbook

  1. Создаем новое приложение: bboard
manage.py startapp article
  1. Регистрируем его в файле настроек приложения по адресу: /var/www/wt.roror.ru/techbook/settings/base.py
INSTALLED_APPS = [
    'home',
    'search',
    'article',
  1. Создание контроллера - кода, запускаемого в ответ на поступление клиентского запроса, который представляет собой интернет ссылку. В данном случае это 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.

  1. Теперь надо привязать обработку функции 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.

  1. Теперь надо позаботиться о представлении выходных данных. По нашей ссылке мы дожны получить оформленный список наших статей. Для этого будем использовать модель. Модель описывает структуру данных и дает простой интерфейс для использования этих данных. Модель класса 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='+')
    
  2. После этого, нам останется только подготовить шаблон для гибкого и красивого вывода необходимой информации. Он упоминался нами в контроллере: 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 %}
    
     ```
    
  3. После этих действий мы получим форматированный список наших статей. django-techbook-01

aizaro@mail.ru