保持Django视图干燥

保持Django视图干燥,django,dry,django-views,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

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

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()
并在每个页面上列出它们


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

会话中已经存在用户ID。因此,您不需要不断地传递它

{{ request.session._auth_user_id }}
这应该可以,但您需要将其添加到设置文件的模板\u上下文\u处理器中:

django.core.context_processors.request
在render_to_响应中,需要将请求作为参数添加。例如:

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

会话中已存在该用户ID。因此,您不需要不断地传递它

{{ request.session._auth_user_id }}
这应该可以,但您需要将其添加到设置文件的模板\u上下文\u处理器中:

django.core.context_processors.request
在render_to_响应中,需要将请求作为参数添加。例如:

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

那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来完成这一点,并@decorator您想要的视图。

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来完成这一点,并@decorator您想要的视图。

您应该使用一个类似的。您可以在自定义标记中获取所需的数据,并将其发送到模板。您需要记住的是将标记加载到要在其中使用的模板文件中。

您应该使用a来实现类似的功能。您可以在自定义标记中获取所需的数据,并将其发送到模板。您需要记住的是将标记加载到您要使用它的模板文件中。

对不起,我输入了一个错误,我想将整个用户对象传递到模板中,而不仅仅是idAgain,如果您已将用户添加到会话中,则整个用户已经存在,因此您应该能够访问它的任何字段。@Cato:{User}如果将django.core.context\u processors.auth放入settings.template\u context\u processors,则可用于任何模板,但匿名用户不是无,而是匿名用户的实例。很抱歉,我输入了一个错误,我想将整个用户对象传递给模板,而不仅仅是idAgain,如果您将用户添加到会话中,则整个用户已经存在,因此您应该能够访问其任何字段。@Cato:{{User}如果将django.core.context\u processors.auth放入settings.template\u context\u processors,则可用于任何模板,但匿名用户不是无,而是匿名用户的实例。看到了,但是你有20个模板中的{%loadmytemplate{u tag%}。。。如果您经常使用它,那么这就不是问题了,很可能是在父模板中扩展的,因此,您只能在一个位置使用它。如果不是这样的话,你可能会使用一个自定义的上下文处理器。但是你有20个模板中的{%LoadMy_template_tag%}。。。如果您经常使用它,那么这就不是问题了,很可能是在父模板中扩展的,因此,您只能在一个位置使用它。如果不是这样,您可能会使用自定义上下文处理器。