【问题标题】:How to include my base template with custom context in Django comment templates?如何在 Django 评论模板中包含我的基本模板和自定义上下文?
【发布时间】:2012-06-13 13:29:24
【问题描述】:

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

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

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

变量blog 在我的视图中包含在上下文中,但不在 cmets 框架中,当我尝试添加评论时,这会导致 No reverse match 错误。

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

更新:

博客应用的网址格式:

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

【问题讨论】:

    标签: django templates url comments django-context


    【解决方案1】:

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

    例如:

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

    【讨论】:

    • 我考虑过context_processors,但是定义get_blog()函数有问题。我的博客变量是根据从 db 检索到的 url 确定的,然后检查用户访问权限。我认为我不能对评论框架 url 执行此操作,因为它们不包含博客 ID。
    • 我编辑了答案以显示这些处理器接收到请求变量。这意味着您实际上可以获取 URL,从而获得用于查找的博客 ID。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2015-03-06
    • 2015-01-23
    相关资源
    最近更新 更多