0

我正在尝试将 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
4

1 回答 1

4

问题是您创建了一个自定义模板过滤器,但您已将其保存在其中views.py,因此 django 将其视为视图。这是错误的 - 你的代码不属于views.py你,你不需要添加任何东西到urls.py. 详细说明...

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

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

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

{{ some_variable|tracwiki }}

如果您不熟悉模板过滤器,这里有一些正在使用的内置过滤器

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

{% load new_filter_module %}
于 2014-04-02T23:31:32.987 回答