django - csrf protection - markdown2

时间:2017-12-13 11:09:16

标签: python django

在我使用django和markdown2的一些博文中,我试图包含如下表单:

views.py:

def post_detail(request, slug=None):
    instance = get_object_or_404(Post, slug=slug)
    if not instance.published:
        raise Http404
    return render(request, "posts/post_detail.html", {'instance': instance})

我的模板post_detail.html包含{{instance.get_markdown}}变量:

{% extends "base.html" %}
{% block body_content %}
<div>
     {{ instance.get_markdown }}
</div>
{% endblock body_content %}

base.html文件:

<html>
<body>
{% block body_content %}
{% endblock body_content %}
</body>
</html>

models.py:

import markdown2

class Post(models.Model):
     ...
     text = models.TextField(verbose_name=_("Text"))
     ...

     def get_markdown(self):
         return mark_safe(markdown2.markdown(self.text)) 

Post中保存文本的示例:

### Example

<form method = "POST">
{% csrf_token %}
First name:<input type="text" name="firstname">
<input type="submit" value="Submit">
</form>

这样,页面只显示字符串&#34; {%csrf_token%}&#34;在表格内。 如何使用csrf保护来渲染帖子?

我的临时解决方案是:

post_detail.html:

{% extends "base.html" %}
{% block body_content %}
<div>
     {{ instance.get_markdown_text }}
</div>
{% if instance.form %}
<div>
    <form method = "POST">{% csrf_token %}
        {{ instance.get_markdown_form }}
    </form>
</div>
{% endif %}
{% endblock body_content %}

models.py:

import markdown2

class Post(models.Model):
     ...
     text = models.TextField(verbose_name=_("Text"))
     form = models.TextField(verbose_name=_("Form"), blank=True, null=True)
     ...

     def get_markdown_text(self):
         return mark_safe(markdown2.markdown(self.text))

     def get_markdown_form(self):
         return mark_safe(markdown2.markdown(self.form))

我对此解决方案不满意,因为不必要的字段&#34;形式&#34;和帖子和post_detail.html中的方法get_markdown_form。

0 个答案:

没有答案