不能在视图中的Django上下文中使用.update()函数吗?

时间:2016-08-17 19:26:23

标签: python django

我有一个函数在我的views.py文件中获取一些基本信息,并且我试图通过让它返回字典来更新每个页面的上下文。但是,在.update()函数的上下文字典中使用render()似乎无效。

这就是我正在做的事情:

def getBaseInfo():
    allPages = list(Page.objects.all())
    primaryPages = allPages[:5]
    secondaryPages = allPages[5:]
    return {'p':primaryPages, 'p2':secondaryPages}

def index(request):
    return render(request, 'pages/index.html', {}.update(getBaseInfo()))

但是,没有任何内容发送到我的模板。提前谢谢!

编辑:我使用的是Python 2.7.11

2 个答案:

答案 0 :(得分:2)

首先,如果你想使用基础字典并添加对象,你应该明确地这样做:

def index(request):
    context = getBaseInfo()
    context.update({'otherkey': 'othervalue'})
    # or
    context['otherkey'] = 'othervalue'
    return(...)

但是,根本不需要这样做。 Django已经为您提供了一种自动提供共享上下文的方法,这是context processor

事实上,您的getBaseInfo()函数已经几乎是一个上下文处理器 - 它只需要接受request参数 - 所以您只需要将它添加到{{ 1}}在您的模板设置中列出。然后所有模板将自动从该函数中获取值。

答案 1 :(得分:1)

你应该这样做:

def index(request):
    allPages = list(Page.objects.all())
    primaryPages = allPages[:5]
    secondaryPages = allPages[5:]
    return render(request, 'pages/index.html', {'p':primaryPages, 'p2':secondaryPages})

其他选项应该是getBaseInfo@property以实现可重用性和干燥目的,或者使基于视图类的模板视图并将可重用代码定义为mixin。我更喜欢后者,但这完全取决于个人选择。