gpt4 book ai didi

django - 如何将对象的 UpdateView 的访问权限限制为该对象的创建者

转载 作者:行者123 更新时间:2023-12-04 20:45:27 25 4
gpt4 key购买 nike

Django 和编程菜鸟在这里。我已经制作了一个我想要部署的应用程序,但我需要弄清楚如何将对该对象的创建者的 UpdateView 访问限制为,我很难过。

当前,用户可以使用 CreateView .../universities/create/创建大学对象,但随后 任何 用户可以使用 .../universities/update/来编辑该对象。我想对此进行配置,以便只有该大学的创建者(具有 ManytoMany 属性“管理员”的任何用户)才能访问其大学对象的 UpdateView。

任何意见,将不胜感激。我在这上面花了几天时间,但并没有太大的吸引力……感谢阅读。

模型.py

class University(models.Model):
name = models.CharField(max_length=100)
about = models.TextField()
administrators = models.ManyToManyField(User)
profile_picture = models.FileField(upload_to=get_upload_file_name, blank=True)

def __unicode__(self):
return unicode(self.name)

def get_absolute_url(self):
return reverse('university_detail', kwargs={'pk': str(self.id)})

View .py
class UniversityCreateView(CreateView):
model = University
form_class = UniversityForm
template_name = 'university_create.html'

def form_valid(self, form):
f = form.save(commit=False)
f.save()
return super(UniversityCreateView, self).form_valid(form)

class UniversityUpdateView(UpdateView):
model = University
form_class = UniversityForm
template_name='university_form.html'

最佳答案

你必须在你的 View 中包含许可装饰器,更多信息在这里https://docs.djangoproject.com/en/dev/topics/auth/ , & https://docs.djangoproject.com/en/dev/topics/auth/default/#topic-authorization

因此,如果您想将更新 View 限制为具有 ManytoMany 属性“管理员”的任何用户,则必须执行以下操作:

View .py

from appname.users.decorators import requiresGroup
from django.contrib.auth.decorators import login_required



class UniversityUpdateView(UpdateView):
model = University
form_class = UniversityForm
template_name='university_form.html'

@method_decorator(requiresGroup("groupname" , login_url='/accounts/login/'))
def dispatch(self, request, *args, **kwargs):
return super(UniversityUpdateView, self).dispatch(request, *args, **kwargs)

此外,如果您还没有,则必须在 models.py 的顶部包含以下内容
from django.contrib.auth.modes import user

虽然我假设它在那里,因为你已经用用户模型定义了你的管理员

然后转到 django 管理员中的组设置(应该是 localhost/admin/auth/group 之类的网址,添加您的特殊管理员组名称,然后转到管理员用户部分(localhost/admin/auth/user),然后使确保他们已被放入管理员组

然后用用户组的实际名称替换@requiresGroup 装饰器中的“groupname”

@requiresGroup 装饰器不是标准的装饰器,因此必须编写

创建一个文件夹路径和文件,如 appname/users.decorators.py
然后在decorators.py中写
from functools import update_wrapper , wraps
from django.utils.decorators import available_attrs
from django.http import HttpResponse, HttpResponseRedirect


def requiresGroup(groupname):
def decorator(view_function):
def _wrapped_view(request,*args,**kwargs):
if request.user.groups.filter(name=groupname).count()!=1:
return HttpResponseRedirect("/")
else:
return view_function(request,*args,**kwargs)
return wraps(view_function,assigned=available_attrs(view_function))(_wrapped_view)
return decorator

希望这有帮助

编辑:犯了一个错误,将装饰器放在类上方,它们应该在类内部的一个函数中,几乎立即注意到我的错误,所以希望我没有造成任何麻烦

关于django - 如何将对象的 UpdateView 的访问权限限制为该对象的创建者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com