Заметки по создание блога на Django
Приложение
Базовый пакет будем далее называть пакетом конфигурации. Он расположен по адресу /var/www/wt.roror.ru/techbook. Создаем новое приложение: bboard
Регистрируем его в файле настроек приложения по адресу /var/www/wt.roror.ru/techbook/settings/base.py
Контроллер
Создание контроллера - кода, запускаемого в ответ на поступление клиентского запроса, который представляет собой интернет ссылку.
В данном случае это 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
Это универсальный маршрут, который вызывает вложенный маршрут на уровне приложения articles - /var/www/wt.roror.ru/article/urls.py
Это локальный маршрут уровня приложения уже вызывает по “корневой” ссылке (‘’) нашу функцию (контроллер) - 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 %}
После этих действий мы получим форматированный список наших статей.