2

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

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

例如,我想要这样:request.user.timezone在用户登录网站时设置;我应该能够在模板和我的视图中访问这个变量。

4

4 回答 4

4

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

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',
)
于 2012-07-30T12:00:18.123 回答
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 }}

简单而且非常干净。

如果您希望在保存用户对象时自动创建用户配置文件,您可以为此使用信号。

于 2012-07-30T12:25:28.507 回答
0

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

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

于 2012-07-30T10:32:12.847 回答
0

使用会话,旨在将变量保留在上下文中。

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

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

于 2012-07-30T12:13:17.687 回答