2014-04-22 7 views
9

ठीक है मेरे पास उपयोगकर्ता वर्ग में no_m नामक एक विधि है और मैंने पहले एक सजावट नहीं लिखी है, लेकिन मूल रूप से मुझे उपयोगकर्ता को अन्य URL पर रीडायरेक्ट करने की आवश्यकता है यदि वे इसे पास करते हैं। मैंने खातों को नामक एक डीआईआर में decorators.py नामक एक फाइल बनाई है और मुझे लगता है कि सजावट सही ढंग से आयात की जाती है, हालांकि मैं इसे काम नहीं कर सकता। यहाँ मैं क्या है:Django कस्टम व्यू सजावट

def no_m(view_func): 
    def _wrapped_view_func(request, *args, **kwargs): 
     try:   
      if request.user.is_m():  
       # quick test 
       return HttpResponseRedirect('http://google.com')    
      else: 
       return view_func(request, *args, **kwargs)  
     except:  
      return _wrapped_view_func 

सभी यह करने की जरूरत है उन अनुप्रेषित यदि वे कहते हैं कि परीक्षा उत्तीर्ण है, मैं नहीं जानता कि क्या यूआरएल तो यह अभी के लिए गूगल की अभी तक की जरूरत है। कोई विचार? जैसे मैंने कहा, मैंने पहले सजावट नहीं लिखी है, इसलिए यह मेरे लिए बिल्कुल नया है। धन्यवाद।

एक और विचार: क्या टेम्पलेट पेज प्रस्तुत करना संभव होगा?

उत्तर

13

आप सजावट में एक कदम खो रहे हैं, या बल्कि आपके पास एक कदम उलझन में है। यह बाहरी फ़ंक्शन है जो आंतरिक फ़ंक्शन (_wrapped_view_func) को वापस करना होगा, और इसे हमेशा ऐसा करना चाहिए: जब मूल कहा जाता है तो मूल कार्य की जगह ले जाती है।

मुझे यकीन नहीं है कि छोड़कर खंड क्या है। इसके अलावा हमेशा रिक्त स्थान का उपयोग करने के लिए एक बुरा विचार होने के कारण - सबकुछ कैच करता है, जिसमें Django फ़ंक्शन में ctrl-c - अपवादों जैसी चीज़ें शामिल हैं, आमतौर पर सजावटी के बजाय मिडलवेयर द्वारा नियंत्रित की जाती हैं। मैं बस इसे हटा दूंगा।

तो कोड होना चाहिए:

def no_m(view_func): 
    def _wrapped_view_func(request, *args, **kwargs): 
     if request.user.is_m():  
      # quick test 
      return HttpResponseRedirect('http://google.com')    
     else: 
      return view_func(request, *args, **kwargs)  
    return _wrapped_view_func 
+0

ठनक कि महान काम किया, मुझे लगता है कि मैं कुछ अलग उदाहरण देखने के बाद थोड़ा उलझन में था। मैंने वापसी रेंडर करने की भी कोशिश की (...) लेकिन यह कुछ भी नहीं किया; क्या कोई तरीका है कि मैं रीडायरेक्ट करने के बजाय टेम्पलेट प्रस्तुत कर सकता हूं? – Callum

+0

मेरा बुरा, फ़ाइल नाम में टाइपो :( – Callum

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