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

时间:2013-08-28 00:51:56

标签: 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)})

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'

3 个答案:

答案 0 :(得分:2)

你必须在你的观点中包含权限装饰者,更多信息在https://docs.djangoproject.com/en/dev/topics/auth/,& https://docs.djangoproject.com/en/dev/topics/auth/default/#topic-authorization

因此,如果您想将updateview限制为具有ManytoMany属性' administrator'的任何用户,则必须执行以下操作:

<强> views.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 admin中的组seetings(应该是像localhost / admin / auth / group这样的url,添加你的特殊管理员组名,然后转到admin用户部分(localhost / admin / auth / user) ,然后确保它们已被放入管理员组

然后替换&#34; groupname&#34;在@requiresGroup装饰器中,包含用户组的实际名称

@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

希望这有帮助

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

答案 1 :(得分:0)

您可以使用UserPassesTestMixin作为文档说明:

  

根据特定权限或其他一些测试限制访问

如果用户应该输入视图,只需实现返回test_func(self)的{​​{1}}。

您可能会编写如下代码:

True

答案 2 :(得分:0)

您可以覆盖基于类的视图的get方法(在这种情况下为UniversityUpdateView)。然后在方法中检查用户是否有权访问该页面,如果没有权限,则不会引发异常或将用户重定向到另一个页面。如果用户具有足够的权限来访问该页面,则只需继续正常行为即可。

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

    def get(self, request, *args, **kwargs):
        if request.user.groups.filter(name=groupname).count()!=1:
                return HttpResponseRedirect("/")
        return super().get(request, *args, **kwargs)