【问题标题】:I can't understand the django-markdownx's usage我无法理解 django-markdownx 的用法
【发布时间】:2017-07-13 22:57:15
【问题描述】:

有点尴尬。但我似乎无法理解django-markdownx 关于如何使用该应用程序的文档。我已经按照Getting Started指南,安装了应用程序和依赖项,添加了 jquery,它可以在 Admin 后端运行。但是模板不会将text = MarkdownxField() 呈现为格式正确的降价,而是呈现为纯文本。

我不明白这部分...然后,使用{{ form.media }} 在模板中包含表单所需的媒体:

<form method="POST" action="">{% csrf_token %}
    {{ form }}
</form>
{{ form.media }}

我尝试在模板中的文章标记之前添加该代码。

{% extends "base.html" %}
{% block content %}
    <form method="POST" action="">{% csrf_token %}
        {{ form }}
    </form>
    {{ form.media }}
    <article>
        <h1>{{ article.title }}</h1>
        <p>{{ article.text }}</p>
        <div>{{ article.pub_date }} {{ article.category }} {{ article.tag }}</div>
    </article>
{% endblock %}

但这并不能解决问题。

我错过了什么?我知道这是微不足道的。但我没有使用表单的经验。


app/models.py

from django.db import models
from django.urls import reverse
from markdownx.models import MarkdownxField

class Article(models.Model):
    title = models.CharField(max_length=250, verbose_name='title')
    text = MarkdownxField()
    pub_date = models.DateField(verbose_name='udgivelsesdato')
    category = models.ForeignKey(Category, verbose_name='kategori', null=True)
    tag = models.ForeignKey(Tag, verbose_name='mærke', null=True)

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

    def __str__(self):
        return self.title

    class Meta():
        verbose_name = 'artikel'
        verbose_name_plural = 'artikler'

settings.py

INSTALLED_APPS = [
    ***
    'markdownx',
    'articles',
]

# Markdown extensions
MARKDOWNX_MARKDOWN_EXTENSIONS = [
    'markdown.extensions.sane_lists',
    'markdown.extensions.nl2br',
    'markdown.extensions.extra',
]

urls.conf

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^', include('articles.urls')),
    url(r'^markdownx/', include('markdownx.urls')),
    url(r'^admin/', admin.site.urls),
]

app/urls.py

from django.conf.urls import url
from django.views.generic.dates import ArchiveIndexView

from articles.models import Article
from articles.views import ArticleDetailView, ArticleListView

urlpatterns = [
    url(r'^arkiv/$',
        ArchiveIndexView.as_view(model=Article, date_field="pub_date"),
        name="article_archive"),
    url(r'^$', ArticleListView.as_view(), name='article_list'),
    url(r'(?P<pk>\d+)/$', ArticleDetailView.as_view(), name='article_detail'),
]

app/templates/app/article_list.html

{% extends "base.html" %}
{% block content %}
    <article>
    <h1>{{ article.title }}</h1>
    <p>{{ article.text }}</p>
    <div>{{ article.pub_date }}</div>
    </article>
{% endblock %}

app/views.py

from django.views.generic import ListView, DetailView

from articles.models import Article


class ArticleListView(ListView):
    model = Article


class ArticleDetailView(DetailView):
    model = Article

【问题讨论】:

  • 您是否在基本文件(或该模板的某处)中包含了 jQuery?如果您使用的是 Chrome,请按 F12 打开开发者控制台 - 那里有任何警告/错误吗?你也可以分享你的forms.py吗?
  • 是的,我确实在 base.html 中包含了 jQuery。它加载正常。控制台中根本没有错误...但是我没有forms.py 我只是按照“模型”下的第一个示例...也许就是这样?我确实需要forms.py?
  • Hrm - 不一定,您使用的是基于通用 Django 类的视图吗?更新视图、创建视图等?如果是这样,您可以改为分享。
  • 不,我刚开始这个项目。我开始做的第一件事是 Markdown 集成。我只有一个 ListView、DetailView 和 ArchiveIndexView
  • 不是你...文档应该更详细。

标签: python django django-templates markdown


【解决方案1】:

好的,我现在看到您的问题(感谢您处理我的问题:))。 django-markdownx 让您能够在表单中使用 Markdown 编辑器。但是,它不会在模板中显示该降价 - 它只是纯文本。

根据this issue on the project's GitHub,您需要在视图中呈现降价,然后将其传递给您的模板。另一种方法,如果我在项目中使用它,我会更喜欢:

from markdownx.utils import markdownify

class Article(models.Model):
    title = models.CharField(max_length=250, verbose_name='title')
    text = MarkdownxField()
    pub_date = models.DateField(verbose_name='udgivelsesdato')
    category = models.ForeignKey(Category, verbose_name='kategori', null=True)
    tag = models.ForeignKey(Tag, verbose_name='mærke', null=True)

    # Create a property that returns the markdown instead
    @property
    def formatted_markdown(self):
        return markdownify(self.text)

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

    def __str__(self):
        return self.title

    class Meta():
        verbose_name = 'artikel'
        verbose_name_plural = 'artikler'

然后在您的模板中:

{% extends "base.html" %}
{% block content %}
    <article>
    <h1>{{ article.title }}</h1>
    <p>{{ article.formatted_markdown|safe }}</p>
    <div>{{ article.pub_date }}</div>
    </article>
{% endblock %}

【讨论】:

  • 对不起,我没有抓住那部分 :) 但是是的,你是对的,它有效,是的,你的解决方案更加优雅。谢谢...您只需添加safe 即可。 &lt;p&gt;{{ article.formatted_markdown|safe }}&lt;/p&gt;
  • 你也可以使用mark_safe装饰器来简化模板。 docs.djangoproject.com/en/2.0/ref/utils/…
【解决方案2】:

另一种方式,根据需要使用模板标签:

from django import template
from django.utils.safestring import mark_safe
from markdownx.utils import markdownify

register = template.Library()

@register.filter
def formatted_markdown(text):
    return mark_safe(markdownify(text))

并像使用它一样

{{ article.text|formatted_markdown }}

【讨论】:

  • 由于是格式问题,我认为使用模板标签是最好的解决方案
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
相关资源
最近更新 更多