Django: настройка проекта/приложения для использования синтаксиса Jinja в постах Markdown
Я перевожу свой сайт с Eleventy на Django. В Eleventy я установил несколько пользовательских фильтров/шорткодов Nunjucks или как они там называются, чтобы я мог использовать Nunjucks для включения отзывчивых веб-изображений, а также пользовательского кода HTML медиаплеера для видеофайлов, вместо того, чтобы каждый раз записывать HTML в Markdown-файл. Я пытаюсь повторить это упрощение в Django с помощью Jinja (поскольку, по собственному признанию Nunjucks, это практически одно и то же), но у меня не получается разобраться с кривой обучения различным вещам, с которыми мне нужно справиться, чтобы сделать это. Из того, что, как мне кажется, я понял на данный момент, у меня есть несколько препятствий:
Выясняю, как заставить мой проект/приложение Django обрабатывать синтаксис Jinja в файлах Markdown и преобразовывать его в HTML. Я нашел то, что выглядит как хорошее контекстное объяснение здесь (https://stackoverflow.com/a/32254521/21423257), но это скорее общее руководство и не объясняет, что вам нужно сделать в вашем проекте/приложении, чтобы это работало. Я использую плагин Markdown, полагаю, этого будет достаточно, но если нет, я готов использовать один из других плагинов Markdown, если они лучше подходят для этой задачи.
Размещение нескольких изображений и/или видеофайлов в сообщении в формате 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, и они предполагают, что у вас будут другие пользователи, размещающие изображения на сайте, поэтому они делают формы для загрузки изображений, а это не то, как я буду использовать или обрабатывать файлы (см. пример выше). Я единственный пользователь, поэтому я буду добавлять посты/изображения/медиа только через страницу администратора. Является ли создание модели для медиафайлов лучшим подходом для моего случая использования?
- Я использую отзывчивый веб-дизайн, а также оптимизацию изображений (маленькие/средние/большие версии для настольных и мобильных компьютеров, плюс несколько разных форматов файлов для совместимости), и кажется, что 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
Я думаю, что это вся необходимая информация, но если вам нужна дополнительная информация или контекст, дайте мне знать, и я отредактирую сообщение. Я также не был уверен, что это слишком много для одного сообщения, так что если мне нужно разбить его на части, дайте мне знать.