用于get_success_url的CreateView中的Django permission_required装饰器method_decorator(self)

时间:2014-01-21 10:03:03

标签: django django-models django-views

    from django.contrib.auth.decorators import permission_required  
    from django.utils.decorators import method_decorator  
    class EnvCreate(CreateView):

           model = Capacity.models.Env
           fields = ["name","dns","manager"]
           template_name_suffix = '_create_form'

           @method_decorator(permission_required('Capacity.add_env'))
           def get_success_url(self):
                  return reverse("envapps", kwargs={"envid": self.object.pk})

我想让用户只有在获得许可的情况下才能添加'env' 我已阅读了许多消息和博客,并且执行相同的方法如上所述 但是到处都在使用dispatch(),但我想在get_success_url之前使用它(不确定这是否是问题)

当我尝试创建env(由具有权限的用户创建)时,我得到的错误,

    TypeError at /Capacity/create/
    _wrapped_view() takes at least 1 argument (0 given)
    Request Method: POST
    Request URL:    http://172.16.68.20:7000/Capacity/create/
    Django Version: 1.6.1
    Exception Type: TypeError
    Exception Value: _wrapped_view() takes at least 1 argument (0 given)
    Exception Location: /usr/lib/python2.6/site-packages/django/utils/decorators.py in _wrapper, line 29

对于我做错了什么或者解决方案有什么想法?

2 个答案:

答案 0 :(得分:7)

得到了答案。在理解派遣的使用方面犯了错误。

    from django.contrib.auth.decorators import permission_required
    from django.utils.decorators import method_decorator
    class EnvCreate(CreateView):

       model = Capacity.models.Env
       fields = ['name','dns','manager']
       template_name_suffix = '_create_form'

       @method_decorator(permission_required('Capacity.add_env',raise_exception=True))
       def dispatch(self, request):
            return super(EnvCreate, self).dispatch(request)

       def get_success_url(self):
            return reverse('envapps', kwargs={'envid': self.object.pk})

答案 1 :(得分:0)

基于类的视图方法无法像这样进行装饰: https://docs.djangoproject.com/en/1.6/topics/class-based-views/intro/#decorating-the-class 您应该实际查看Mixins,这将是实现此类功能的最佳方法。 您可以通过检查Django Braces轻松查看(甚至可以重复使用)此类功能: https://github.com/brack3t/django-braces

还有更多为什么要在get_success_url方法中实现此功能?如果不允许用户执行该操作,则应在任何数据提交之前拒绝该操作,这样更安全,在流量和操作方面的系统负载较少。 如果您仍然需要执行这样的任务,请创建一个Mixin,检查get_success_url是否有权限,如果用户有正常权限,如果不是throw和exception,请注意在成功验证表单后调用get_success_url,这意味着您的数据已经保存,如果需要,除了可能是logedin或权限检查之外,您应该使用form_valid方法进行其他检查。