2014-01-21 58 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(權限....)。謝謝你的幫助 –