在django中,我使用authenticate()函数来记录用户。使用request.user
,我可以访问从users表中提取的登录用户信息。如果我request.user.id
,我可以获得用户的ID。在任何模板中,在任何请求中,我都可以user.username
来获取用户名。
我有没有办法为request.user
变量添加值,以便我可以在整个应用程序和模板中使用它们?
例如,我希望在用户登录网站时设置:request.user.timezone
;我应该能够在模板和视图中访问此变量。
答案 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。在文档中,它提供了设置和管理用户时区的示例。