我正在尝试将trac wiki markdown格式呈现为html,以便在我的网站上显示。我尝试遵循另一个 SO 问题"如何使用 trac wiki 格式",但代码片段在我运行时返回错误。应该指出的是,问题和代码已经将近 4 年了。知道我怎样才能让它工作吗?
在我的 urls.py 中,我只是调用tracwiki
(从代码段)视图。
# 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
问题是你已经创建了一个自定义模板过滤器,但你已经把它保存在 views.py
中,所以 django 把它当作一个视图。这是错误的 - 您的代码不属于views.py
,您无需向urls.py
添加任何内容。详细阐述...
使用您当前的配置,当 URLConf (通过您添加的'^$'
模式)获取对站点根目录的请求时,django 希望 tracwiki()
函数返回一个HttpResponse
对象 - 因为它认为这是一个视图。
但是,如果我们查看这个tracwiki()
函数,您可以看到我们不会通过render()
或render_to_response()
等返回HttpResponse
对象。相反,我们返回一个没有 .get()
属性的 SafeText
对象,与HttpResponse
对象不同,因此当中间件对我们返回的对象调用 .get()
时会出现异常。
相反,您需要删除添加到urls.py
的行,并在要呈现此标记的相应 HTML 模板中使用模板过滤器。例如
{{ some_variable|tracwiki }}
如果您不熟悉模板筛选器,以下是一些正在使用的内置筛选器。
您还需要将tracwiki()
逻辑移出views.py
文件,并移动到新templatags
目录中的新模块中。在文档中阅读有关此内容的更多信息(但请记住,在调用过滤器之前,您需要在模板中加载此新模块)
{% load new_filter_module %}