如何在Django评论模板中包含我的基本模板和自定义上下文?

时间:2012-06-13 13:29:24

标签: django templates url comments django-context

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

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

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

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

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

更新

博客应用的网址模式:

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

1 个答案:

答案 0 :(得分:2)

创建一个context processor。这些只是返回dict的函数,其项目可在模板中的任何位置使用。通常,您会在相关的Django应用中创建一个context_processor.py文件,然后将其包含在TEMPLATE_CONTEXT_PROCESSORS设置中。

E.g:

项目/ 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 }}访问模板中的博客,或者您仍然可以使用上下文处理器。