2011-10-27 12 views
8

मैं इस तरह तरह का Django के डिफ़ॉल्ट उपयोगकर्ता वर्ग के लिए एक प्रॉक्सी मॉडल को परिभाषित करने, कुछ करना चाहते हैं:बेस मॉडल उदाहरण से कास्टिंग डीजेगो में व्युत्पन्न प्रॉक्सी मॉडल में कास्टिंग?

class MyUser(User): 

    def pretty_username(self): 
     if self.first_name: 
      return self.first_name 
     return self.username 

    class Meta: 
     proxy = True 

और, मैं दृश्य कोड से pretty_username कॉल करने के लिए सक्षम होने के लिए चाहते हैं (और आदर्श, यहां तक ​​कि टेम्पलेट्स से)। क्या मानक उपयोगकर्ता मॉडल का उदाहरण लेने और इसे MyUser के उदाहरण में टाइप-कास्ट करने का एक आसान तरीका है?

यहां तक ​​कि कुछ __init__ जादू मेरे साथ ठीक हो जाएगा, जब तक कि मैं कह सकता हूँ:

my_user = MyUser(request.user) 
मेरे विचार कोड में

+1

ऐसा लगता है कि आप एक आवरण या एडाप्टर बनाने के लिए कोशिश कर रहे हैं उपयोगकर्ता वर्ग के लिए। ऐसा कुछ होगा: http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ चाल चलाना? – mbrenig

उत्तर

4

तुम सच में पूर्ण प्रॉक्सी वस्तु उपलब्ध करना चाहते हैं, यह (एक अतिरिक्त डेटाबेस कॉल की कीमत पर) एक त्वरित और गंदे समाधान

class MyUser(User): 

    def pretty_username(self): 
     if self.first_name: 
      return self.first_name 
     return self.username 

    class Meta: 
     proxy = True 


def get_myuser(self): 
    try: 
     return MyUser.objects.get(pk=self.pk) 
    except MyUser.DoesNotExist: 
     return None 

User.add_to_class('get_myuser', get_myuser) 

तो एक दृश्य में इस का उपयोग करने के आप कह सकते हैं है :

request.user.get_myuser().pretty_username() 

या एक टेम्पलेट में:

{{ request.user.get_myuser.pretty_username }} 

एक अच्छे समाधान के लिए, आप से बंधा नहीं कर रहे हैं प्रॉक्सी मॉडल विचार है, तो निम्न होगा:

def pretty_username(self): 
    if self.first_name: 
     return self.first_name 
    return self.username 

User.add_to_class('pretty_username', pretty_username) 

यह अनुमति होगी निम्नलिखित:

request.user.pretty_username() 

या

{{ request.user.pretty_username }} 
+10

get_myuser विधि को उपयोगकर्ता ऑब्जेक्ट के प्रकार को उपयोगकर्ता से MyUser में बदलना है। यह '__class__' विशेषता का उपयोग करके किया जा सकता है: 'def get_myuser (self): self .__ class__ = MyUser' बिना किसी अतिरिक्त डेटाबेस कॉल के – fhahn

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