我在我的项目中包含了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')),
答案 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 }}
访问模板中的博客,或者您仍然可以使用上下文处理器。