2015-04-16 13 views
6

मैं उपयोगकर्ता एक विशेष उपयोगकर्ता सेटिंग पृष्ठ को देखने के लिए अनुमति दी है इससे पहले कि कुछ शर्तों की जांच करने की कोशिश कर रहा हूँ। मैं user_passes_test सजावट का उपयोग करके इसे प्राप्त करने की कोशिश कर रहा हूं। फ़ंक्शन निम्नानुसार क्लास आधारित दृश्य में बैठता है। मैं दृश्य में get_initial फ़ंक्शन को सजाने के लिए विधि सजावट का उपयोग कर रहा हूं।कैसे वर्ग आधारित विचारों में user_passes_test डेकोरेटर उपयोग कैसे करें?

def test_settings(user): 
    print "I am in test settings" 
    if not (user.profile.is_student or user.profile.is_parent or user.profile.is_teacher): 
     return False 
    else: 
     return True 

मैं डेकोरेटर के साथ नीचे त्रुटि हो रही है:

class UserSettingsView(LoginRequiredMixin, FormView): 
    success_url = '.' 
    template_name = 'accts/usersettings.html' 

    def get_form_class(self): 
     if self.request.user.profile.is_student: 
      return form1 
     if self.request.user.profile.is_teacher: 
      return form2 
     if self.request.user.profile.is_parent: 
      return form3 

    @method_decorator(user_passes_test(test_settings, login_url='/accounts/usertype/')) 
    def get_initial(self): 
     if self.request.user.is_authenticated(): 
      user_obj = get_user_model().objects.get(email=self.request.user.email) 
      if user_obj.profile.is_student: 
       return { .......... 
     ...... .... 

नीचे test_settings कार्य है।

File "../django/core/handlers/base.py", line 111, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "../django/views/generic/base.py", line 69, in view 
    return self.dispatch(request, *args, **kwargs) 
File "../braces/views.py", line 107, in dispatch 
    request, *args, **kwargs) 
File "../django/views/generic/base.py", line 87, in dispatch 
    return handler(request, *args, **kwargs) 
File "../django/views/generic/edit.py", line 162, in get 
    form = self.get_form(form_class) 
File "../django/views/generic/edit.py", line 45, in get_form 
    return form_class(**self.get_form_kwargs()) 
File "../django/views/generic/edit.py", line 52, in get_form_kwargs 
    'initial': self.get_initial(), 
File "../django/utils/decorators.py", line 29, in _wrapper 
    return bound_func(*args, **kwargs) 
TypeError: _wrapped_view() takes at least 1 argument (0 given) 

मैं कैसे इस त्रुटि को हल करने के लिए यकीन नहीं है। क्या मैं गलत कार्य पर सजावटी को लागू कर रहा हूं? कोई भी लीड सहायक होगी।

उत्तर

14

Django 1.9 वर्ग आधारित विचारों के लिए प्रमाणीकरण mixins है। इस प्रकार आप UserPassesTest mixin उपयोग कर सकते हैं।

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin 

class UserSettingsView(LoginRequiredMixin, UserPassesTestMixin, View): 
    def test_func(self): 
     return test_settings(self.request.user) 

    def get_login_url(self): 
     if not self.request.user.is_authenticated(): 
      return super(UserSettingsView, self).get_login_url() 
     else: 
      return '/accounts/usertype/' 

नोट इस मामले में आप get_login_url ओवरराइड करने के लिए है, क्योंकि आप चाहे उपयोगकर्ता के प्रवेश नहीं, या में लॉग ऑन है लेकिन परीक्षण में विफल रहता है के आधार पर एक अलग यूआरएल रीडायरेक्ट करना चाहते है।

Django 1.8 और इससे पहले के लिए, आपको dispatch विधि को सजाने चाहिए, get_initial नहीं।

@method_decorator(user_passes_test(test_settings, login_url='/accounts/usertype/')) 
def dispatch(self, *args, **kwargs): 
    return super(UserSettingsView, self).dispatch(*args, **kwargs) 
+0

समझ गया। धन्यवाद! – pxUx

+0

आपका उदाहरण पढ़ता है कि यदि उपयोगकर्ता प्रमाणीकृत है तो लॉगिन यूआरएल वापस कर दें। अगर/अन्य को बदला जाना चाहिए? – pymarco

+0

@pymarco अच्छी जगह है, अब तय – Alasdair

संबंधित मुद्दे