我无法理解django-markdownx的用法

6 python django markdown django-templates

这有点令人尴尬.但我似乎无法理解django-markdownx关于如何使用该应用程序的文档.我已经按照入门指南,安装了应用程序和依赖项,添加了jquery,它在Admin后端工作.但模板不会呈现text = MarkdownxField()为格式正确的markdown,而是呈现为纯文本.

我不理解这部分......然后,使用{{ form.media }}以下内容在模板中包含表单所需的媒体:

<form method="POST" action="">{% csrf_token %}
    {{ form }}
</form>
{{ form.media }}
Run Code Online (Sandbox Code Playgroud)

我试图在模板中的article标签之前添加该代码.

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

但它没有解决它.

我错过了什么?我知道这是微不足道的.但我没有形式经验.


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'
Run Code Online (Sandbox Code Playgroud)

settings.py

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

# Markdown extensions
MARKDOWNX_MARKDOWN_EXTENSIONS = [
    'markdown.extensions.sane_lists',
    'markdown.extensions.nl2br',
    'markdown.extensions.extra',
]
Run Code Online (Sandbox Code Playgroud)

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),
]
Run Code Online (Sandbox Code Playgroud)

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'),
]
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Jen*_*rup 15

好的,我现在看到你的问题(谢谢你处理我的问题:)).django-markdownx为您提供了在表单中包含Markdown编辑器的功能.但是,它不会在模板中显示时标记降价 - 它只是纯文本.

根据项目的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'
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

{% extends "base.html" %}
{% block content %}
    <article>
    <h1>{{ article.title }}</h1>
    <p>{{ article.formatted_markdown|safe }}</p>
    <div>{{ article.pub_date }}</div>
    </article>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 对不起,我没有抓到那个部分:)但是,你是对的它有效,是的,你的解决方案更优雅.谢谢......你只需要添加`safe`就可以了.`<p> {{article.formatted_markdown | safe}} </ p>` (5认同)
  • 您也可以使用mark_safe装饰器来简化模板。https://docs.djangoproject.com/zh-CN/2.0/ref/utils/#django.utils.safestring.mark_safe (2认同)