在Django中,我如何知道当前登录的用户?

85

在Django中,我如何知道当前登录的用户?


1
你的前一个问题的副本?http://stackoverflow.com/questions/1476596/login-code-for-django - Abizern
8
@Abizem,这绝不是这个问题的副本。 - Kirk Woll
4个回答

117

你需要知道用户的位置吗?

视图中,可以通过请求的request.user获取用户。

如需在模板中处理用户,请参见此处

如果要保存模型实例的创建者或编辑者,可以执行以下操作:

model.py

class Article(models.Model):
    created_by = models.ForeignKey(User, related_name='created_by')
    created_on = models.DateTimeField(auto_now_add = True)
    edited_by  = models.ForeignKey(User, related_name='edited_by')
    edited_on  = models.DateTimeField(auto_now = True)
    published  = models.BooleanField(default=None)

admin.py

class ArticleAdmin(admin.ModelAdmin):
    fields= ('title','slug','text','category','published')
    inlines = [ImagesInline]
    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        if not hasattr(instance,'created_by'):
            instance.created_by = request.user
        instance.edited_by = request.user
        instance.save()
        form.save_m2m()
        return instance

    def save_formset(self, request, form, formset, change): 

        def set_user(instance):
            if not instance.created_by:
                instance.created_by = request.user
            instance.edited_by = request.user
            instance.save()

        if formset.model == Article:
            instances = formset.save(commit=False)
            map(set_user, instances)
            formset.save_m2m()
            return instances
        else:
            return formset.save()

我在互联网上找到了这个,但我不记得具体在哪里了。


4
注意,在save_formset -> set_user中,应该是如果instance没有'created_by'属性,则执行。 - FurtiveFelon
我可以在settings.py中获取当前用户吗? - Mahendra Garg
为什么要这样做?(请提出一个新问题,我的Django时代已经过去了) - vikingosegundo
@vikingosegundo,我只是想知道为什么你不再使用Django了?你不再从事后端开发了吗?还是你已经转向NodeJS了? - Alfa Bravo
我目前专门从事iOS开发工作,但为了原型制作的目的,Django仍然是我首选的武器。 - vikingosegundo
1
由于某种原因,我使用内部函数set_user并通过instances进行映射时它对我不起作用。它只是没有将新模型保存到数据库中。我不得不使用for instance in instances:,并在循环内部使用set_user体,这样就完美地解决了问题。此外,我认为if formset.model == Article应该是if formset.model == Image。感谢@vikingosegundo的答案。我已经试图解决这个问题好几天了! - ekauffmann

8

在扩展@vikingosegundo的答案时,如果您想要在模型内获取用户名,我找到了一种涉及声明中间件的方法。在应用程序中创建一个名为get_username.py的文件,并使用以下内容:

from threading import current_thread

_requests = {}

def get_username():
    t = current_thread()
    if t not in _requests:
         return None
    return _requests[t]

class RequestMiddleware(object):
    def process_request(self, request):
        _requests[current_thread()] = request

编辑你的settings.py文件,并将其添加到MIDDLEWARE_CLASSES中:

MIDDLEWARE_CLASSES = (
    ...
    'yourapp.get_username.RequestMiddleware',
)

现在,在您的save()方法中,您可以像这样获取当前用户名:
from get_username import get_username

...

def save(self, *args, **kwargs):
    req = get_username()
    print "Your username is: %s" % (req.user)

专用线程:https://dev59.com/dGgu5IYBdhLWcg3w6bGo - Ciro Santilli OurBigBook.com
@nKn是真正必要的中间件来调用Models对象中的get_username()吗?如果是这样的话,有一个关于此的规范文档链接会很好。在1.9.5中是否有更新的本地Django函数可以完成相同的操作? - alvas

6

Django 1.9.6默认项目在默认模板中包含user

因此,您可以直接编写以下内容:

{% if user.is_authenticated %}
    {{ user.username }}
{% else %}
    Not logged in.
{% endif %}

这一功能由settings.py中的django.contrib.auth.context_processors.auth上下文处理器提供。

专门的模板问题:如何在Django模板中访问用户资料?


0

您只需要请求当前用户:

 def foo():
         current_user = request.user
         return print(current_user)
 foo()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接