保持Django视图DRY

时间:2009-07-07 09:30:32

标签: django dry django-views

我有一些代码可以获取当前登录的用户。

userID = request.session.get("_auth_user_id")
    if userID:
        loggedin_user = User.objects.get(pk=int(userID))
    else:
        loggedin_user = None

我希望用户名显示在每个页面上。

目前我将代码放在每个视图中并将用户对象传递给每个模板

return render_to_response('index.html', {loggedin_user})

这似乎与django的D.R.Y道德相悖。我怎么能重复自己呢?

编辑:也许用户是个坏榜样。

如果我想从数据库中获取对象列表

,该怎么办?
items = Item.objects.all()

并在每个页面上列出它们。

我是否必须编写该代码并将列表传递给每个视图中的模板。或者,我可以编写一些代码,使所有模板都能使用该列表吗?

3 个答案:

答案 0 :(得分:3)

会话中已存在用户ID。因此,您无需继续传递它。

{{ request.session._auth_user_id }}

这应该可行,但您需要在设置文件中的TEMPLATE_CONTEXT_PROCESSORS中添加它:

django.core.context_processors.request

在render_to_response中,您需要将请求添加为参数。例如:

 return render_to_response('test.html',{}, context_instance=RequestContext(request))

答案 1 :(得分:1)

request.user?

怎么样?
if request.user.is_authenticated():
    name = request.user.username
else:
    name = "Anonymous"

无论如何,如果它还没有在django中可用,我建议你编写一个中间件类,就像django.contrib.sessions.middleware.SessionMiddleware或django.contrib.auth.middleware.AuthenticationMiddleware一样。该类在将请求详细信息发送到视图之前对其进行更改。

如果你需要在每个视图的基础上,你可以写一个装饰器来做那么一点,@decorator你想要的视图。

答案 2 :(得分:1)

你应该使用custom template tag这样的东西。您可以在自定义标记中获取所需的数据,并将其发送到模板。您需要记住的是将标签加载到您将要使用它的模板文件中。