2012-06-13 65 views
1

我在我的項目中包含了Django評論框架,並添加了自定義模板以包含我的基本模板而不是默認模板。如何在Django評論模板中包含帶有自定義上下文的基本模板?

然而,在我的基礎模板,有與動力學參數的幾個網址模板標籤:

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

可變博客包含在我的意見的情況下,而不是在註釋框架,導致沒有反向匹配錯誤,當我嘗試添加評論。

什麼是獲得變量的最佳方式博客總是包含在基本模板中?

更新:

URL模式的博客應用:

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

回答

2

創建自己context processor。這些只是返回dict的函數,其中的項目將在模板中的任何位置可用。通常,您將在相關的Django應用程序中創建一個context_processor.py文件,然後將其包含在您的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 }}訪問模板中的博客,或者仍然可以使用上下文處理器。

+0

我已經考慮了context_processors,但是在定義get_blog()函數時存在問題。我的博客變量是根據從數據庫檢索到的url確定的,然後檢查用戶訪問權限。我不認爲我可以爲評論框架網址做這件事,因爲它們不包含博客ID。 – yossarian

+0

我編輯了答案以顯示這些處理器收到請求變量。這意味着您實際上可以獲取URL並因此獲取查找的博客ID。 –