Django中的基本MVT问题

时间:2009-04-24 14:46:46

标签: python django django-templates

我有一个Django网站如下:

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

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

但现在我想让它变得动态,并为它添加一些动态数据。我在哪个视图上这样做?我的所有观点基本上都是render_to_response('viewtemplate.html', someContext)。那么如何为基本模板添加一个公共视图呢?

显然我不会将公共代码复制到每个单独的视图......

我认为我在Django的MVT基础上缺少一些基本的东西。

3 个答案:

答案 0 :(得分:7)

您想使用context_instanceRequestContext

首先,添加到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 Template Docs

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

或使用generic view,因为它们会自动传递请求上下文。

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