【问题标题】:Django + trac-wiki to html markdown 'SafeText' object has no attribute 'get'Django + trac-wiki 到 html markdown 'SafeText' 对象没有属性 'get'
【发布时间】:2014-05-12 17:31:18
【问题描述】:

我正在尝试将 trac wiki markdown 格式呈现为 html 以显示在我的网站上。我尝试关注另一个SO question 'how do i use trac wiki formatting',但code snippet 在我运行它时返回错误。需要注意的是,问题和代码已经有将近 4 年的历史了。知道如何让它工作吗?

在我的 urls.py 中,我只需调用 tracwiki(来自 sn-p)视图。

# urls.py

url(r'^$',                       'tracwiki',              name='index'),

#views.py

"""
Usage:

{% load tracwiki %}

{{ object.body|tracwiki }}

# Logic from http://groups.google.com/group/trac-dev/msg/479decac43883dc0
"""

from trac.test import EnvironmentStub, Mock, MockPerm 
from trac.mimeview import Context 
from trac.wiki.formatter import HtmlFormatter 
from trac.web.href import Href

from django.utils.safestring import mark_safe
from django import template
register = template.Library()

env = EnvironmentStub() 
req = Mock(href=Href('/'), abs_href=Href('http://www.example.com/'), 
           authname='anonymous', perm=MockPerm(), args={})
context = Context.from_request(req, 'wiki')

@register.filter
def tracwiki(s):
    return mark_safe(HtmlFormatter(env, context, s).generate())

这是返回的错误:

[01/Apr/2014 18:40:53] "GET / HTTP/1.1" 500 60948


AttributeError at /

'SafeText' object has no attribute 'get'

Request Method:     GET
Request URL:    http://xxx.xxx.xxx.xxx/
Django Version:     1.5.5
Exception Type:     AttributeError
Exception Value:    

'SafeText' object has no attribute 'get'

Exception Location:     /mysite/local/lib/python2.7/site-packages/django/middleware/clickjacking.py in process_response, line 30
Python Executable:  /Envs/mysite/bin/python
Python Version:     2.7.5

【问题讨论】:

    标签: python django django-templates trac wiki-markup


    【解决方案1】:

    问题是你创建了一个custom template filter,但是你把它保存在views.py,所以django把它当作view来对待。这是错误的——你的代码不属于views.py,你不需要添加任何东西到urls.py。详细说明...

    使用您当前的配置,当 URLConf(通过您添加的 '^$' 模式)接收到您的站点根目录的请求时,django 期望 tracwiki() 函数返回一个 HttpResponse 对象 - 因为它认为这是一个视图。

    但是,如果我们查看这个 tracwiki() 函数,您可以看到我们没有通过 render()render_to_response() 等返回 HttpResponse 对象。相反,我们返回了一个没有.get() 属性,与 HttpResponse 对象不同,因此中间件在我们返回的对象上调用 .get() 时会出现异常。

    相反,您需要删除添加到urls.py 的行,并在要呈现此标记的相应 HTML 模板中使用模板过滤器。例如

    {{ some_variable|tracwiki }}
    

    如果您不熟悉模板过滤器,here are some built-in filters being used

    您还需要将tracwiki() 逻辑从views.py 文件中移出并移到新的templatags 目录中的新模块中。在docs 中阅读更多相关信息(但请记住,在调用过滤器之前,您需要在模板中加载这个新模块)

    {% load new_filter_module %}
    

    【讨论】:

    • 非常感谢您的详细解答。我从未创建或使用过自定义 templatetag,所以我不明白我在该代码 sn-p 中看到的内容(因此试图将其连接为视图)。无论如何,文档的链接和您的解释使我能够完美地配置它。这是太棒了。基本上,我使用来自tracwiki 的起始页作为我网站主页上的快速启动内容。现在我只需要维护一个区域,另一个更新。 :)
    • 没问题 - 如果您不知道自定义模板过滤器是什么,我可以理解您将其放入 views.py 的思考过程。
    猜你喜欢
    • 2017-10-14
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2020-04-01
    相关资源
    最近更新 更多