Возможно ли добавить возможность прикреплять блоки кода к форме поста?
Я пытался найти что-нибудь об этом некоторое время, но я не знаю, может это моя формулировка, но я не могу найти ничего об этом.
В общем... Я работаю над проектом для школы, и в основном это сайт, который делает много вещей, и одна из этих вещей - это что-то вроде mini-stackoverflow, но только для сообщества моей школы. Поэтому я разработал форму для сообщения, используя crispy forms, однако я не могу найти никакой информации о том, как добавить возможность писать в блоках кода в форму (как мы делаем здесь, на 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 в HTML. Похоже, что django-markdownx может сделать это для вас.
- Вы можете добавить поддерживаемые расширения в список.
- MarkdownX использует пакет python-markdown, который имеет список поддерживаемых расширений. Вы должны добавить расширение code fences в список расширений.
Installation и Getting Started, которые я кратко изложил ниже.
Сначала установите MarkdownX:
pip install django-markdownx
В settings.py добавьте его в список установленных приложений:
INSTALLED_APPS = (
# [...]
'markdownx',
)
В urls.py добавьте URL MarkdownX:
urlpatterns = [
# [...]
path('markdownx/', include('markdownx.urls')),
]
Убедитесь, что у вас есть параметр STATIC_ROOT в settings.py. Эта строка создаст каталог 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.media }} после тега </form>.
Теперь содержимое вашего поста должно отображаться с форматированием Markdown всякий раз, когда вы используете {{ post.formatted|safe }} в шаблоне, например, так:
{% 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.
