2014-01-21 32 views
2
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'。
我已经阅读了许多消息和博客,并且执行上述操作的方法如上所述。
但处处讯()正在被使用,但我想get_success_url(不知道这是问题)Django permission_required decorator method_decorator在CreateView for get_success_url(self)

的错误,我得到当我尝试创建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 

任何想法是什么我做错了什么或可以解决什么?

回答

5

得到了答案。在了解调度的使用方面犯了错误。

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}) 
0

类为本次方法不能布置得像是: https://docs.djangoproject.com/en/1.6/topics/class-based-views/intro/#decorating-the-class 你实际上应该考虑混入,这将是实现这种功能的最佳方法。 你可以很容易地看到(甚至重复使用)这种功能通过检查Django的括号: https://github.com/brack3t/django-braces

进一步为什么要实施get_success_url方法的过程中这个功能?如果用户不被允许执行该操作,则在提交任何数据之前应该拒绝该操作,这更安全,在流量和操作方面的系统负载更少。 如果你仍然需要执行这样的任务,创建一个Mixin,检查get_success_url的权限,如果用户有正常的权限,如果不是抛出和异常,尽管get_success_url在成功验证表单后调用,这意味着你的数据已经被保存了,如果需要,除了可能进行logedin或权限检查之外,你应该侵入form_valid方法进行额外的检查。

+0

得到了解决方案。我不必在get_success_url之前添加装饰器,而只需添加一个调度函数,如上面[链接]给出的链接所示(https://docs.djangoproject.com/en/1.6/topics/class-based-views /前奏/#加饰的类)。所以我只是离开了get_success_url,就像以前一样。并在新的调度功能之前添加了@method_decorator(权限....)。谢谢你的帮助 –