我正在从事一个Django 1.5项目。
应用程序包含
Owner
Admin
Viewer用户模型有一个字段is_shared (布尔值)来识别主用户和共享用户,access_level映射到另一个模型MultiUser中。
我已经想过要用这种方式来实现它。
get_queryset中签入。is_shared=True,将进行第一次检查但这将需要在整个应用程序视图集中进行更改。
有一种在不对整个应用程序进行更改的情况下这样做的方法。可能是middleware**.**
编辑2: MultiUser模型
class MultiUser(models.Model):
user = models.ForeignKey(User, related_name='owner_user')
shared_user = models.ForeignKey(User, related_name='shared_user')
access_level = models.CharField(max_length=50)发布于 2019-05-20 13:27:16
我通过创建一个包含内容的中间件来解决这个问题。
class MultiUserMiddleware(object):
def process_request(self, request):
"""
Check if user profile is is_shared=True
If user is a shared user, get owner user from multi user
and assign owner user to request.user
Any multi user profile created by the owner user will work on behalf of the owner user
"""
user = request.user
if not user.is_anonymous():
# if request.path in settings.MUTLIUSER_ALLOWED_PATH:
# return None
# Search using wildcard
if any(fnmatch(request.path, p) for p in settings.MUTLIUSER_ALLOWED_PATH):
return None
try:
if user.profile.get().is_shared:
owner = MultiUser.objects.filter(shared_user=user)[0].user
request.user = owner
except:
return None
return None该中间件检查用户的帐户是否是基于is_shared的共享用户,然后使用所有者用户对象更改request.user。这还防止更改设置文件(Ex.、profile、change_password等)中定义的特定路径的请求所有者。
发布于 2019-02-12 07:37:41
您可以使用单个基类来处理,而不是更新所有视图集。
from django.http import HttpResponse
from django.views import View
class BaseView(View):
def get_queryset(self, request):
if request.user.is_shared:
#some is_shared value
u = MultiUser.objects.filter(user=request.user)
if u.exists():
return #some multiuser value
else:
return #some non multi user value
class Meta:
abstract=True
class MyView(BaseView):
def get(self, request):
q = self.get_queryset
#view logic
return HttpResponse('result')
class MyView2(BaseView):
def get(self, request):
q = self.get_queryset
#view logic
return HttpResponse('result')https://stackoverflow.com/questions/54643932
复制相似问题