2

我正在尝试使用上下文处理器构建动态侧边栏。我从数据库表中为侧边栏获取不同的值。

这是我的上下文处理器:

from clients.models import client
def sidebar(request):
        return {'clientlist': client.objects.order_by('name').distinct('name')}

在views.py 我有以下代码:

from django.shortcuts import render
from django.template import loader, RequestContext
from clients.models import client
def index(request):
        allclientlist = client.objects.all()
        return render (request, 'clients/index.html', {'allclientlist': allclientlist}, context_instance=RequestContext(request, processors=['sidebar']))

allclientlist用于生成包含所有客户端及其数据的表。接下来我正在尝试使用上下文处理器构建动态侧边栏并获得以下回溯

Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/root/projects/webapp/clients/views.py" in index
  7.    return render (request, 'clients/index.html', {'allclientlist': allclientlist}, context_instance=RequestContext(request, processors=['sidebar']))
File "/usr/local/lib/python2.7/site-packages/django/template/context.py" in __init__
  179.             self.update(processor(request))

Exception Type: TypeError at /clients/
Exception Value: 'str' object is not callable

当它像这样时它起作用了:

def index(request):
       allclientlist = client.objects.all()
       clientlist = client.objects.order_by('name').distinct('name')
       return render(request, 'clients/index.html', {'allclientlist': allclientlist, 'clientlist': clientlist})

但是为了让这个菜单在所有视图中都可用,我需要clientlist在所有视图中都有声明。我想避免这种情况并卡住了。请帮我找出这个错误。

4

1 回答 1

0

如果您想clientlist包含在所有视图中,请添加client.models.sidebar到您的TEMPLATE_CONTEXT_PROCESSORS设置中,并从视图中的调用中删除context_instance参数render- 当您使用render快捷方式时,模板会自动呈现请求上下文。

def index(request):
    allclientlist = Client.objects.all()
    return render(request, 'clients/index.html', {'allclientlist': allclientlist})

顺便说一句,Django 约定是将侧边栏上下文处理器移动到一个client.context_processors模块中,并将您的模型大写为Client.

于 2013-07-27T12:19:09.840 回答