Django: настройка проекта/приложения для использования синтаксиса Jinja в постах Markdown

Я перевожу свой сайт с Eleventy на Django. В Eleventy я установил несколько пользовательских фильтров/шорткодов Nunjucks или как они там называются, чтобы я мог использовать Nunjucks для включения отзывчивых веб-изображений, а также пользовательского кода HTML медиаплеера для видеофайлов, вместо того, чтобы каждый раз записывать HTML в Markdown-файл. Я пытаюсь повторить это упрощение в Django с помощью Jinja (поскольку, по собственному признанию Nunjucks, это практически одно и то же), но у меня не получается разобраться с кривой обучения различным вещам, с которыми мне нужно справиться, чтобы сделать это. Из того, что, как мне кажется, я понял на данный момент, у меня есть несколько препятствий:

  1. Выясняю, как заставить мой проект/приложение Django обрабатывать синтаксис Jinja в файлах Markdown и преобразовывать его в HTML. Я нашел то, что выглядит как хорошее контекстное объяснение здесь (https://stackoverflow.com/a/32254521/21423257), но это скорее общее руководство и не объясняет, что вам нужно сделать в вашем проекте/приложении, чтобы это работало. Я использую плагин Markdown, полагаю, этого будет достаточно, но если нет, я готов использовать один из других плагинов Markdown, если они лучше подходят для этой задачи.

  2. Размещение нескольких изображений и/или видеофайлов в сообщении в формате Markdown. Мои посты в формате Markdown обычно выглядят так:

Here is some text.

{Here is some Jinja code to display an image or video file}

Here is some more text.

{Here is some more Jinja code to display an image or video file}

Из того, что я видел здесь, кажется, что если вы собираетесь размещать несколько изображений/файлов в сообщении в формате markdown, то лучше всего сделать отдельную модель для работы с изображениями, а затем поместить URL-адреса этих изображений/файлов в сообщение. Однако в примерах, которые я вижу, изображения обычно помещаются в некую галерею, где они вызывают URL с помощью цикла for, и они предполагают, что у вас будут другие пользователи, размещающие изображения на сайте, поэтому они делают формы для загрузки изображений, а это не то, как я буду использовать или обрабатывать файлы (см. пример выше). Я единственный пользователь, поэтому я буду добавлять посты/изображения/медиа только через страницу администратора. Является ли создание модели для медиафайлов лучшим подходом для моего случая использования?

  1. Я использую отзывчивый веб-дизайн, а также оптимизацию изображений (маленькие/средние/большие версии для настольных и мобильных компьютеров, плюс несколько разных форматов файлов для совместимости), и кажется, что Pillow хорошо подходит для этого. Я пока не особо вникал в этот вопрос, потому что я просто пытаюсь заставить изображения отображаться в первую очередь, но я упомяну об этом здесь на случай, если добавление этого изменит код, который я использую, или то, как Django обрабатывает медиафайлы.

Что мне нужно добавить или изменить в моем проекте/приложении, чтобы все это заработало? Вот вся необходимая информация в файлах:

settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
STATIC_ROOT = BASE_DIR / 'staticfiles'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

models.py

from django.db import models
from django.utils import timezone
from django.template.defaultfilters import slugify
from django.urls import reverse


class Tag(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Article(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    slug = models.SlugField(null=False, unique=True)
    date = models.DateTimeField(default=timezone.now)
    tags = models.ManyToManyField("Tag", related_name="articles")
    image = models.FileField(blank=True)
    # Add line for video?

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("article_detail", kwargs={"slug": self.slug})

# Taken from https://soshace.com/2020/08/18/upload-multiple-images-to-a-django-model-without-plugins/       
class ArticleFile(models.Model):
    article = models.ForeignKey(Article, default=None, on_delete=models.CASCADE)
    images = models.FileField(upload_to = 'images')
    # Add line for video? models.FileField(upload_to = 'videos')
    
    def __str__(self):
        return self.article.title
# End image model

urls.py (проект)

[...snip, but at the end of the file I have:]

if settings.DEBUG:  # new
    urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

views.py

from django.shortcuts import render
from django.views import generic
from .models import Tag, Article
from django.http import JsonResponse

class ArticleListView(generic.ListView):
    model = Article
    paginate_by = 6
    template_name = "index.html"

class ArticleDetailView(generic.DetailView):
    model = Article
    template_name = "article.html"

markdown.py (в моей папке templatetags)

from django import template
from django.template.defaultfilters import stringfilter

import markdown as md

register = template.Library()


@register.filter()
@stringfilter
def markdown(value):
    return md.markdown(value)

jinja2.py (в моей папке с приложениями)

from jinja2 import Environment 
from django.urls import reverse  
from django.templatetags.static import static


def environment(**options):  
    env = Environment(**options)  
    env.globals.update({  
        "static": static,  
        "url": reverse  
    })  
    return env

Я думаю, что это вся необходимая информация, но если вам нужна дополнительная информация или контекст, дайте мне знать, и я отредактирую сообщение. Я также не был уверен, что это слишком много для одного сообщения, так что если мне нужно разбить его на части, дайте мне знать.

Вернуться на верх