Как правильно отобразить RenderedMarkdownField() в шаблоне, если "безопасный" не "работает"?
На моем сайте django я использую RenderedMarkdownField()
для создания причудливо выглядящего текста описания к моим сообщениям. Моя модель выглядит следующим образом:
# Portfolio project overview model
class Work(models.Model):
title = models.CharField(max_length=100)
# description = models.TextField()
description = MarkdownField(rendered_field='description_rendered', validator=VALIDATOR_STANDARD)
description_rendered = RenderedMarkdownField()
image = models.ImageField(upload_to="work_app/media/images/", null=True, blank=True)
video = models.FileField(upload_to="work_app/media/videos/", null=True, blank=True)
pdf = models.FileField(upload_to="work_app/media/documents/", null=True, blank=True)
# To show the title in the Admin page
def __str__(self):
return self.title
Тогда моя work_index.html
страница выглядит следующим образом при рендеринге каждого проекта из моей базы данных (личная идентифицирующая/важная информация вычеркнута):
Как вы видите, символы Markdown в тексте описания (*) видны в этом описании. Чтобы исправить это, мы используем тег Django safe
и вместо него выводим поле work.description_rendered
, поэтому мой код при итерации каждого поста выглядит так:
<div class="row">
{% for work in works %}
<div class="col-md-4">
<div class="card mb-2">
<a href="{% url 'work_detail' work.pk %}">
<img class="card-img-top" src="{{ work.image.url }}">
</a>
<div class="card-body">
<a href="{% url 'work_detail' work.pk %}">
<h5 class="card-title project-title-link">{{ work.title }}</h5>
</a>
<p class="card-text">{{ work.description_rendered | safe | truncatechars:200 }}</p>
<a href="{% url 'work_detail' work.pk %}" class="btn btn-primary">
Read More
</a>
</div>
</div>
</div>
{% endfor %}
</div>
... НО, как только я вношу эти изменения с добавленным тегом safe
и изменяю work.description
на work.description_rendered
в соответствии с django-markdown, моя отображаемая страница становится испорченной и выглядит так:
Заметьте, как "строка" теперь по какой-то причине меняется на "колонку" постов, а также текст описания нижнего поста выделен жирным шрифтом, когда это определенно НЕ так, как у меня в описании в формате markdown. Интересно, может ли кто-нибудь объяснить мне, что здесь происходит, или мне нужно использовать другой тег, а не safe
?
Проблема заключается в том, что вы преобразовываете рендеринг уценки в тег <p>
, что приводит к недопустимому HTML. Вместо этого используйте <div>
.
Markdown обернет абзацы внутри своего содержимого в теги <p>
. Однако спецификация HTML не позволяет тегу <p>
содержать другой тег <p>
. Поэтому следует обернуть содержимое в тег <div>
или другой общий тег уровня блока.
<div class="card-text">{{ work.description_rendered | safe | truncatechars:200 }}</div>
Я предлагаю использовать инструмент "inspect" вашего браузера, чтобы увидеть, как браузер отображает HTML страницы. Это поможет при отладке проблем, подобных этой.