Django中的基本MVT问题

6 投票
3 回答
572 浏览
提问于 2025-04-15 11:14

我有一个Django网站,情况如下:

  • 这个网站有几个不同的页面
  • 每个页面都有自己的模板来展示数据
  • 每个模板都是从一个基础模板扩展出来的
  • 基础模板是整个网站的基础,里面包含了所有的JS/CSS和基本布局

到目前为止,一切都很好。现在我们有了网站的主头部(这个在基础模板里),它是所有页面共有的。

但现在我想让它变得动态,想在里面添加一些动态数据。我应该在哪个页面上做这个呢?我的所有页面基本上都是用 render_to_response('viewtemplate.html', someContext) 来渲染的。那么我该如何把一个公共的视图添加到基础模板里呢?

显然,我不想把公共的代码复制到每个单独的页面里……

我觉得我在Django的MVT基础上缺少了一些根本的东西。

3 个回答

-1

或者使用一个通用视图,因为它们会自动接收到请求的上下文。

可以使用一个简单的直接指向模板的通用视图,这样就不需要手动导入或传递请求上下文了。

2

上下文处理器和请求上下文(可以参考Tyler的回答)是处理在每次页面加载时都需要的数据的好方法。如果你有一些数据在不同的页面上需要用到,但并不是所有页面都需要(尤其是那些和页面主要内容关系不大的数据,比如出现在导航侧边栏的内容),那么定义一个自定义模板标签来获取这些数据通常是最合适的做法。

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 模板文档

撰写回答