是否可以添加将代码块附加到 post 表单的功能?

Is it possible to add a feature to attach code-blocks to a post form?

一段时间以来,我一直在努力寻找相关信息,但我不知道这是不是我的措辞,但我似乎找不到任何相关信息。

无论如何...我正在为学校做一个项目,基本上它是一个可以做很多事情的网站,其中之一就像一个 mini-Whosebug只是为了我学校的社区。因此,我使用 crispy forms 为 post 设计了一个表单,但是我似乎找不到任何关于如何添加将代码块写入表单的功能的信息(就像我们在 Stack Overflow 上所做的那样)。

这是表单在代码中的样子:

模板:

<form method="POST" enctype="multipart/form-data">
                    {% csrf_token %}
                    <fieldset class="form-group">
                        <legend class="border-bottom mb-4">Nueva Publicación</legend>
                        {{ form|crispy }}
                    </fieldset>
                    <div>
                    <div class="form-group">
                        <button class="btn btn-outline-info" type="submit">Crear Publicación</button>
                    </div>
                </form>

型号

class Post(models.Model):
titulo  = models.CharField(max_length=150)
contenido = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
imagen = models.ImageField(default='default.jpg', upload_to='blog_images')

def __str__(self):
    return self.titulo

def get_absolute_url(self):
    return reverse("post-detail", kwargs={"pk": self.pk})

视觉上:

如果你们需要其他任何帮助,请告诉我,我会尽快提供。

您需要一个可以将 Markdown-formatted 文本翻译成 HTML 的模块。看起来 django-markdownx 可以为您做这件事。

只需按照我总结如下的 Installation and Getting Started 说明进行操作即可。

首先,安装MarkdownX:

pip install django-markdownx

settings.py 中,将其添加到您的已安装应用列表中:

INSTALLED_APPS = (
    # [...]
    'markdownx',
)

urls.py 中,添加 MarkdownX 网址:

urlpatterns = [
    # [...]
    path('markdownx/', include('markdownx.urls')),
]

确保您在 settings.py 中有 STATIC_ROOT 设置。此行将在项目的根文件夹中创建一个 static 目录:

STATIC_ROOT = BASE_DIR / 'static'

将 MarkdownX 静态资源添加到 STATIC_ROOT:

python3 manage.py collectstatic

Post.contenido 更改为使用 MarkdownxField:

from markdownx.models import MarkdownxField
from markdownx.utils import markdownify

class Post(models.Model):
    # title = ...
    contenido = MarkdownxField() # not models.TextField()
    # date_posted, author, etc.

    def formatted(self):
        "Returns formatted HTML for post content."
        return markdownify(self.contenido)

在您的模板中,在 </form> 标签后添加 {{ form.media }}

现在,只要您在模板中使用 {{ post.formatted|safe }},您的 post 内容就会以 Markdown 格式显示,如下所示:

{% extends "base.html" %}

{% block content %}
<h2>{{ object.title }}</h2>
{{ object.formatted|safe }}
{% endblock %}

我用 Django 4.0.2、django-markdownx 3.0.1 和 markdown 3.3.6 测试了这个。