sir模型python实现_python-Django:获取模型s中的当前用户

python-Django:获取模型s中的当前用户

我想以models.py的Timesheet方法获得当前登录的用户(Tasks)。 我想检查用户的角色,并查看它是否可以根据其角色执行某些操作。

models.朋友:

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 admin。 是否有任何方法可以通过save方法获得request.user或检查并更新admin.py中另一个模型中的值?

6个解决方案

31 votes

您可以从另一个角度解决这个问题。 除了应更改模型保存方法外,您还应覆盖AdminSites save_model方法。 如您已指出的那样,您将在其中拥有请求对象,并且可以访问已登录的用户数据。

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

Jens answered 2020-07-30T00:10:46Z

18 votes

我找到了一种方法,但是它涉及到声明一个MiddleWare。 在应用内创建一个名为save()的文件,内容如下:

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

编辑您的save()并将其添加到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 answered 2020-07-30T00:11:15Z

8 votes

我不认为save_model方法重写是最好的选择。 例如,想象一下您要保存用户信息或基于用户信息验证模型,而save()并非来自视图或管理站点本身。

人们在问的是这样的结构:

def save(..)

self.user = current_user()

要么

def save(..)

user = current_user()

if user.group == 'XPTO':

error('This user cannot edit this record')

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

[HTTPS://bit bucket.org/请/Django-current-user/overview]

Josir answered 2020-07-30T00:11:52Z

7 votes

@nKn提出的解决方案是一个很好的起点,但是当我今天尝试实现该解决方案时,我遇到了两个问题:

在当前的Django版本中,创建为纯对象的中间件不起作用。

单元测试失败(因为它们通常在单线程中运行,因此如果第一个测试具有HTTP请求而第二个测试没有HTTP请求,则您的“请求”将被卡在两个后续测试之间)。

这是我更新的中间件代码,可与Django 1.10一起使用且不会破坏单元测试:

from threading import current_thread

from django.utils.deprecation import MiddlewareMixin

_requests = {}

def current_request():

return _requests.get(current_thread().ident, None)

class RequestMiddleware(MiddlewareMixin):

def process_request(self, request):

_requests[current_thread().ident] = request

def process_response(self, request, response):

# when response is ready, request should be flushed

_requests.pop(current_thread().ident, None)

return response

def process_exception(self, request, exception):

# if an exception has happened, request should be flushed too

_requests.pop(current_thread().ident, None)

Igor Pomaranskiy answered 2020-07-30T00:12:26Z

3 votes

正确的方法是使用get_request().user,而不是使用带有__call__的字典,因为这将导致内存泄漏,因为旧值将在应用程序运行的过程中一直存在:

import threading

request_local = threading.local()

def get_request():

return getattr(request_local, 'request', None)

class RequestMiddleware():

def __init__(self, get_response):

self.get_response = get_response

def __call__(self, request):

request_local.request = request

return self.get_response(request)

def process_exception(self, request, exception):

request_local.request = None

def process_template_response(self, request, response):

request_local.request = None

return response

如果要访问用户而不是请求,则可以在__call__上保存get_request().user,或保存用户而不是请求

Francisco Couzo answered 2020-07-30T00:12:50Z

0 votes

您是否尝试过使用以下库:

[HTTPS://皮衣皮.org/project/Django-current user/]

网站使用方式摘要:

from django_currentuser.middleware import (get_current_user, get_current_authenticated_user)

# As model field:

from django_currentuser.db.models import CurrentUserField

class Foo(models.Model):

created_by = CurrentUserField()

Mihir answered 2020-07-30T00:13:19Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值