6

我有一个 Django 网站,如下所示:

  • 网站有几个视图
  • 每个视图都有自己的模板来显示其数据
  • 每个模板扩展一个基本模板
  • 基础模板是网站的基础,拥有所有的 JS/CSS 和基本布局

所以到目前为止一切都很好。所以现在我们有了站点的主负责人(存在于基本模板中),并且所有视图都是通用的。

但现在我想让它动态化,并为其添加一些动态数据。我应该在哪个观点上这样做?我所有的看法基本上都是render_to_response('viewtemplate.html', someContext)。那么如何将通用视图添加到基本模板中呢?

显然我不会将通用代码复制到每个单独的视图中......

我认为我在 Django 的 MVT 基础中遗漏了一些基本的东西。

4

3 回答 3

7

您想使用context_instanceRequestContexts。

首先,在您的顶部添加views.py

from django.template import RequestContext

然后,将所有视图更新为如下所示:

def someview(request, ...)
    ...
    return render_to_response('viewtemplate.html', someContext, context_instance=RequestContext(request))

在您的settings.py中,添加:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    ...
    'myproj.app.context_processors.dynamic',
    'myproj.app.context_processors.sidebar',
    'myproj.app.context_processors.etc',
)

其中每一个context_processors都是一个函数,它接受request对象并以字典的形式返回上下文。只需将所有功能context_processors.py放入适当的应用程序中即可。例如,博客可能有一个带有最近条目和评论列表的侧边栏。context_processors.py只会定义:

def sidebar(request):
    recent_entry_list = Entry.objects...
    recent_comment_list = Comment.objects...
    return {'recent_entry_list': recent_entry_list, 'recent_comment_list': recent_comment_list}

您可以根据需要添加尽可能多或尽可能少的内容。

有关更多信息,请查看Django 模板文档

于 2009-04-24T15:08:44.310 回答
2

上下文处理器和 RequestContext(请参阅 Tyler 的回答)是获取在每次页面加载时使用的数据的方法。对于您可能需要的各种视图上的数据,但不是全部(尤其是与视图的主要目的无关,但出现在导航侧边栏之类的数据),定义自定义模板通常最有意义用于检索数据的标签。

于 2009-04-27T11:51:17.847 回答
-1

或使用通用视图,因为它们会自动传递请求上下文。

可以使用简单的直接模板通用视图来避免在请求上下文中导入/传递。

于 2009-04-24T15:50:48.700 回答