1

我在我的项目中包含了 Django 评论框架,并添加了自定义模板以包含我的基本模板而不是默认模板。

但是,在我的基本模板中,有一些带有动态参数的 url 模板标签:

{% url galleries blog.pk blog.slug %}

变量blog包含在我的视图中的上下文中,但不包含在评论框架中,当我尝试添加评论时,这会导致没有反向匹配错误。

将变量博客始终包含在基本模板中的最佳方法是什么?

更新:

博客应用程序的 url 模式:

url(r'^(?P<blog_id>\d+)/(?P<slug>[\-\d\w]+)/galleries/$', 'galleries', name = 'galleries'),
(r'^comments/', include('django.contrib.comments.urls')),
4

1 回答 1

2

为自己创建一个上下文处理器。这些只是返回 a 的函数,dict其项目将在模板中的任何位置可用。通常,您将context_processor.py在相关的 Django 应用程序中创建一个文件,然后将其包含在您的TEMPLATE_CONTEXT_PROCESSORS设置中。

例如:

项目/myapp/context_processors.py:

def blog(request):
    return {
        'blog': get_blog(),
    }

在您的设置中:

TEMPLATE_CONTEXT_PROCESSORS = (
    # ... standard django ones here ...
    'project.myapp.context_processors.blog',
)

现在blog将在您的所有模板中可用。

编辑:我忘记了这些上下文处理器方法接收request作为参数,它可以让你做更强大的东西。

编辑 2:根据显示 URL 模式的更新...您可以创建一个从 kwargs 中提取的中间件blog_id并将其添加到请求对象中:

class BlogMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
         blog_id = view_kwargs.pop('blog_id', None)
         if blog_id:
             request.blog = Blog.objects.get(id=blog_id)

现在您可以使用任一模板访问博客,{{ request.blog }}也可以使用上下文处理器。

于 2012-06-13T13:57:05.320 回答