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)
您必须在视图中包含权限装饰器,更多信息位于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)
希望这有帮助
编辑:犯了一个错误,将装饰器放在类之上,它们应该位于类内部的函数中,几乎立即注意到我的错误,所以希望我没有造成任何麻烦
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |