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'
答案 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)