2015-12-11 7 views
7

Django के उपयोगकर्ता मॉडल का डिफ़ॉल्ट वापसी क्षेत्र 'उपयोगकर्ता नाम' है। हालांकि, मेरे आवेदन को इसे 'first_name' होना चाहिए। वर्तमान में, मैं सिर्फ Django काँटेदार और उपयोगकर्ता मॉडल के लिए यह परिवर्तन किया है:Django: उपयोगकर्ता मॉडल के वापसी क्षेत्र को अनुकूलित करें

def __str__(self): 
    return self.first_name 

यह ठीक काम करता है, लेकिन मुझे आश्चर्य है कि अगर वहाँ Django forking बिना ऐसा करने का अन्य सरल तरीके हैं?

+2

संपादन पुस्तकालय एक उचित समाधान नहीं है। आपको उपयोगकर्ता मॉडल को उप-वर्ग करना चाहिए और बाल वर्ग के भीतर स्ट्र फ़ंक्शन का उपयोग करना चाहिए। – ruddra

उत्तर

6

आपके User कक्षा पर एक नई विधि को इंजेक्ट करने का एक तरीका है।

from django.contrib.auth.models import User 

def get_first_name(self): 
    return self.first_name 

User.add_to_class("__str__", get_first_name) 

आप (अधिमानतः models.py अंदर)

बहुत साफ नहीं common आवेदन में रखते, लेकिन अगर आप केवल इस एक परिवर्तन की जरूरत है, पूरे User मॉडल अधिभावी के बिना काम करता है सकते हैं।

5

मुझे लगता है कि यह करने के लिए सबसे अच्छा तरीका है एक custom user model उपयोग करने के लिए है, तो get_full_name() और/या get_short_name() परिभाषित first_name वापस जाने के लिए किया जाएगा।

3

पहले, django documentation

एक बार का उपयोग कर एक कस्टम उपयोगकर्ता बनाने के लिए, आप अपने कस्टम उपयोगकर्ता, MyUser कक्षा के लिए जाना है। First_name, last_name या जो कुछ भी आपको चाहिए, जैसे फ़ील्ड जोड़ें।

आपको इस तरह की कुछ चीज़ मिल जाएगी। इस के लिए अपने वर्ग के भीतर

class MyUser(AbstractBaseUser): 
    email = models.EmailField(
     verbose_name='email address', 
     max_length=255, 
     unique=True, 
    ) 
    first_name = models.CharField(max_length=32) 
    last_name = models.CharField(max_length=32) 
    date_of_birth = models.DateField() 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['date_of_birth'] 

    def get_full_name(self): 
     # The user is identified by their email address 
     return self.email 

    def get_short_name(self): 
     # The user is identified by their email address 
     return self.email 

    def __str__(self):    # __unicode__ on Python 2 
     return self.email 

    def has_perm(self, perm, obj=None): 
     "Does the user have a specific permission?" 
     # Simplest possible answer: Yes, always 
     return True 

    def has_module_perms(self, app_label): 
     "Does the user have permissions to view the app `app_label`?" 
     # Simplest possible answer: Yes, always 
     return True 

    @property 
    def is_staff(self): 
     "Is the user a member of staff?" 
     # Simplest possible answer: All admins are staff 
     return self.is_admin 

अब, संपादित __str__ कार्य करते हैं।

def __str__(self):    # __unicode__ on Python 2 
     return self.first_name 

याद रखें, date_of_birth आदि जैसे फ़ील्ड वैकल्पिक हैं।

1

क्या निम्न समाधान काम करेगा?

class MyUser(User): 

    def __str__(self): 
     return self.first_name 

और अब User का उपयोग नहीं करते हैं, बजाय MyUser का उपयोग करें।

+4

अफसोस की बात है कि उपयोगकर्ता मॉडल के समान फ़ील्ड के साथ my_user नामक एक और डीबी तालिका तैयार करेगी। MyUser ऑब्जेक्ट में जो भी मूल्य आप स्टोर करते हैं उसे उपयोगकर्ता ऑब्जेक्ट और vise versa से एक्सेस नहीं किया जा सकता है – Ramast

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