在Django中,我怎么知道当前登录的用户?


Answers:


109

您需要在哪里了解用户?

视图中,用户在请求中以形式提供request.user

有关模板中的用户处理,请参见此处

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

模型

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)

管理员

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中,如果不是hasattr(instance,'created_by'),则应该为
FurtiveFelon 2010年

如何在settings.py中获得当前用户?
Mahendra Garg

为什么要这么做?(请提出一个新的问题,我的django时代已经过去了)
vikingosegundo

@vikingosegundo我只是想知道为什么您不再使用Django?您是否不再进行后端开发,还是继续使用NodeJS?
阿尔法·布拉沃

1
由于某种原因,使用内部函数set_user然后通过映射它对我不起作用instances。它只是没有将新模型保存到数据库中。我不得不使用for instance in instances:set_user身体的内循环和完美。另外,我认为if formset.model == Article应该是if formset.model == Image。感谢@vikingosegundo的回答。为了解决这个问题,我几天都在敲键盘!!
ekauffmann '19

6

扩展@vikingosegundo的答案,如果要在Models中获取用户名,我发现了一种方法,该方法涉及声明MiddleWare。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)


@nKn是get_username()Models对象中调用所需的真正专用的MiddleWare吗?如果是这样,那么可以找到有关此方面的规范文档的链接。1.9.5中是否有更新的本地django函数可以执行相同的操作?
阿尔瓦斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.