Django:在模型s中获取当前用户

2024-09-26 18:00:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在models.py的save方法中获取当前登录的用户(request.user)。我想检查用户的角色,看看它是否可以根据他的角色执行一些操作。

型号.py

class TimeSheet(models.Model):
    check_in_time = models.TimeField()
    check_out_time = models.TimeField()

class Tasks(models.Model):
    time_sheet = models.ForeignKey(TimeSheet)
    project = models.ForeignKey(Project)
    start_time = models.TimeField()
    end_time = models.TimeField()

    def save(self, *args,**kwargs):
        project = SpentTime.objects.get(project__project__id = self.project.id)
        start = datetime.datetime.strptime(str(self.start_time), '%H:%M:%S')
        end = datetime.datetime.strptime(str(self.end_time), '%H:%M:%S')
        time = float("{0:.2f}".format((end - start).seconds/3600.0))

        if common.isDesigner(request.user):
            SpentTime.objects.filter(project__project__id = self.project.id).update(design = float(project.design) + time)

        if common.isDeveloper(request.user):
            SpentTime.objects.filter(project__project__id = self.project.id).update(develop = float(project.develop) + time)

        super(Tasks, self).save(*args, **kwargs)

这里,Tasks模型被用作Timesheet模型的内联。我想检查当前登录用户的角色,并根据该用户的角色更新另一个模型。这里我需要request.user来检查当前用户的角色。我没有使用任何形式或模板,完全利用Django管理。是否有方法在save方法中获取request.user,或者在admin.py中检查并更新另一个模型中的值?


Tags: 用户模型selfprojectid角色datetimetime
3条回答

我找到了一种方法,它包括声明一个中间件。在应用程序中创建名为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)

我不认为保存模型方法覆盖是最好的选择。例如,假设您想要保存用户信息或基于用户信息验证模型,并且save()不是来自视图或管理员站点本身。

人们问的是这样的结构:

def save(..)
    self.user = current_user()

或者

def save(..)
    user = current_user()
    if user.group == 'XPTO':
        error('This user cannot edit this record')

到目前为止,我发现最好的方法是:

https://bitbucket.org/q/django-current-user/overview

你可以从另一个角度来解决这个问题。您应该重写adminisitessave_model方法,而不是更改models save方法。在这里,您将拥有request对象,并且可以访问已登录的用户数据,正如您已经指出的那样。

看看这一章的文档:Django ModelAdmin documentation save_model

相关问题 更多 >

    热门问题