2012-03-01 53 views
2

是否有推荐的方法将变量传递给我的所有视图?就我而言,我想传递一个UserProfile对象,该对象是一个django.contrib.auth.models.User对象。我发现大部分(如果不是全部)我的视图需要拉取UserProfile对象并将它放入Middleware看起来就像是要走的路。好像我可以做类似如下(我见过一对夫妇的解决方案,在线的暗示吧):在不使用request.session的情况下将自定义变量添加到Django Middleware中的请求对象中

request.session['userprofile'] = userprofile_object 

我不喜欢这一点,因为如果我的用户配置模型曾经有一个非序列化字段,它会打破request.session。

回答

0

此提议取决于用户配置对象仅在用户已登录时才起作用的假设,因此您可以通过request.user获取登录用户。 应该可以通过行驶在逆向这样的外键键关系得到USERPROFILE:

if request.user.is_authenticated(): 
    request.user.userprofile_object_set.all() #gets all related userprofile objects 
else: 
    #... 
+0

是的,有多种方式可以获取UserProfile对象。你也可以做UserProfile.objects.filter(user = request.user),但是这并不回答这个问题,你如何将它传递给视图? – jsw 2012-03-01 23:20:37

+0

也许我误解了你的问题。因为每个视图都获取作为第一个参数传入的请求,所以不需要将该配置文件“传递”到视图中。如果你想在每个模板上都有一个userprofile变量,你可以考虑一个自定义的context_processor,它将userprofile_object放入一个变量中。 – Jingo 2012-03-01 23:29:13

+0

我相信'prof = request.user.userprofile_object_set.all()[0]'每次调用时都会触发数据库? – user9876 2012-10-08 16:16:15

3

如果您已经启用了AuthenticationMiddleware,你将不得不在所有的意见user对象。要获取配置文件,您需要在您的视图中拨打user.get_profile。例如,要输出配置文件的ID,您应该执行{{ user.get_profile.id }}

如果您不希望每次都调用用户对象的get_profile函数,则可以将任意项添加到您的请求中。您可以创建一个新的中间件这将只需设置

request.user_profile = request.user.get_profile() 

然后,只需登记您的settings.py中间件,你应该是好去。过去,我使用这种方法来获取固定到请求对象的用户地理位置数据。

相关问题