2013-04-14 4 views
19

view.pyकेवल सुपरसियर के लिए दृश्य को सीमित कैसे करें?

@login_required 
@permission_required('is_superuser') 
def score_reset(request): 
    pass 

url.py

url(r'^score-reset/$', score_reset, name='score-reset'),  

मैं निम्नलिखित कोड है और मेरे आश्चर्य मैं अभी भी एक गैर सुपर उपयोगकर्ता के साथ लॉग इन होने के बावजूद समारोह मारा,। मैं एक अनुमति प्राप्त करने की उम्मीद कर रहा था।

मुझे क्या याद आ रही है?

उत्तर

33

is_superuser अनुमति नहीं है, यह उपयोगकर्ता मॉडल पर एक विशेषता है। Django पहले से ही एक और decorator you can make use of called user_passes_test इस जाँच करने के लिए है:

from django.contrib.auth.decorators import user_passes_test 

@user_passes_test(lambda u: u.is_superuser) 
def score_reset(self,...): 
    ... 
+0

btw, मैं एक नकली न जवाब के रूप में मुझे लगता है कि 'user_passes_test' एक मौजूदा Django डेकोरेटर के साथ ही तथ्य यह है कि' is_superuser है उल्लेख करने के लिए लिंक करने के बाद के रूप में इस अंकन नहीं कर रहा हूँ ' –

+2

अनुमति नहीं है प्रश्न केवल सुपरसियर को प्रतिबंधित करने के लिए पूछता है। उदाहरण कोड @user_passes_test (lambda u: u.is_superuser) होना चाहिए – mhost

+0

'user_passes_test' [उपरोक्त स्निपेट] का उपयोग करना काम करता है। लेकिन आप यह विचार करना चाहेंगे कि यह सभी गैर-सुपर उपयोगकर्ताओं के लिए लॉगिन पृष्ठ पर रीडायरेक्ट होगा, भले ही वे पहले ही लॉग इन हैं। आप नौकरी पाने के लिए अपना खुद का सजावटी लिखना चाह सकते हैं। – allsyed

1

@user_passes_test एक सुरुचिपूर्ण समाधान अगर आप कई विचारों पर इस जांच करना चाहते हैं नहीं है। उदाहरण के लिए आप अपने खुद के सजावट को आसानी से लिख सकते हैं @staff_member_require।

Here आप संभावित समाधानों में से एक देख सकते हैं।

0

ऊपर दिए गए उत्तर django के शुरुआती संस्करणों के लिए प्रतीत होते हैं। वे बाद के संस्करण

django 1.11 के लिए थोड़ा जटिल हैं, लेकिन यह थोड़ा समान लेकिन सरल रणनीति है।

views.py

from django.contrib.auth.decorators import login_required 

@login_required 
def some_view(request): 
if request.user.is_superuser: 
    //allow access only to superuser 
    return render(request, 'app/template1.html', args) 
else: 
    //allow access only to user 
    return render(request, 'app/template2.html', args) 
संबंधित मुद्दे