添加到django request.user变量

时间:2012-07-30 09:19:33

标签: python django authentication login

在django中,我使用authenticate()函数来记录用户。使用request.user,我可以访问从users表中提取的登录用户信息。如果我request.user.id,我可以获得用户的ID。在任何模板中,在任何请求中,我都可以user.username来获取用户名。

我有没有办法为request.user变量添加值,以便我可以在整个应用程序和模板中使用它们?

例如,我希望在用户登录网站时设置:request.user.timezone;我应该能够在模板和视图中访问此变量。

4 个答案:

答案 0 :(得分:3)

您可以编写一个简单的中间件:

class UserTZMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if request.user.is_authenticated():
            request.user.timezone = evaluate_tz()

然后将其附加到MIDDLEWARE_CLASSES文件中的settings.py

MIDDLEWARE_CLASSES = (
    ....,
    'myapp.UserTZMiddleware',
)

答案 1 :(得分:3)

您是否要让用户更改时区并强制使用特定的时区?我假设您愿意,如果是这样,您希望在您的数据库中保持时区可配置。因此,我建议您制作一个与用户对象具有一对一关系的UserProfile模型。

你可以这样做:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    time_zone = models.whateverField()
    ... add anything else you would like to extend your profile ...

在你的模板上你可以通过这样做获得时区:

{{ request.user.userprofile.time_zone }}

简单而且非常干净。

如果您希望在保存User对象时自动创建userprofile,则可以使用信号。

答案 2 :(得分:0)

将请求上下文处理器添加到TEMPLATE_CONTEXT_PROCESSORS。此处理器将请求添加到上下文中,您可以在模板中{{request}}或{{request.user}}

请参阅:https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request

答案 3 :(得分:0)

使用sessions,它们旨在将变量保存在上下文中。

您不应该更改request.user,因为这是其他应用程序将依赖的内容,以及由django自己的身份验证机制填充的内容。

如果您需要专门跟踪时区,请阅读django 1.4中的timezone support。在文档中,它提供了设置和管理用户时区的示例。