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

Mit*_*ney 5 django django-models django-views django-permissions

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

当前,用户可以使用CreateView ... / universities / create /创建大学对象,但是任何用户都可以使用... / universities / update /编辑该对象。我要配置它,以便只有作为该大学的创建者的用户(任何具有ManytoMany属性“ administrator”的用户)才可以访问其大学对象的UpdateView。

任何意见,将不胜感激。我已经花了几天的时间,但是我并没有做太多的事情……感谢您的阅读。

models.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)})
Run Code Online (Sandbox Code Playgroud)

views.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'
Run Code Online (Sandbox Code Playgroud)

Aes*_*ete 2

您必须在视图中包含权限装饰器,更多信息位于https://docs.djangoproject.com/en/dev/topics/auth/https://docs.djangoproject.com/en/dev/topics/ auth/default/#主题授权

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

视图.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)
Run Code Online (Sandbox Code Playgroud)

另外,如果您还没有,则必须在 models.py 的顶部包含以下内容

from django.contrib.auth.modes import user
Run Code Online (Sandbox Code Playgroud)

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

然后转到 django admin 中的组设置(应该是像 localhost/admin/auth/group 这样的 url,添加您的特殊管理员组名称,然后转到管理员用户部分(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
Run Code Online (Sandbox Code Playgroud)

希望这有帮助

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