2016-03-31 7 views
6

लोअरकेस में डिफ़ॉल्ट चार्फील्ड कैसे सेट करें? यह मेरा मॉडल है:Django मॉडल - लोअरकेस में डिफ़ॉल्ट charfield सेट करें

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=64) 
    name = models.CharField(max_length=200) 
    phone = models.CharField(max_length=20) 
    email = models.CharField(max_length=200) 

    def __init__(self, *args, **kwargs): 
     self.username = self.username.lower() 

मैं __init__ कोशिश की, लेकिन यह काम नहीं करता। जब भी नया रिकॉर्ड सहेजा जाता है, मैं उपयोगकर्ता को लोअरकेस में बनाना चाहता हूं। धन्यवाद।

+0

आप कोशिश कर सकते हैं एक इस http://stackoverflow.com/questions/2350681/django-lowercasecharfield – onerciller

उत्तर

9

बस इसे सहेजने के तरीके में करें। यानी Model वर्ग की विधि को ओवरराइड करें।

def save(self, *args, **kwargs): 
    self.username = self.username.lower() 
    return super(User, self).save(*args, **kwargs) 
+3

यह इंगित करने के लिए जब अपने मॉडल यह केवल मदद करता है के लिए महत्वपूर्ण है अद्यतन सहेजने के माध्यम से जाओ। यदि आप एक क्वेरीसेट पर एक .update() कोड लिखते हैं, तो आप सहेजने के माध्यम से नहीं जाते हैं, इसलिए अभी भी आपके डेटाबेस फ़ील्ड में अपरकेस अक्षरों के साथ समाप्त हो सकते हैं। इस मामले के लिए – aggieNick02

+0

@ aggieNick02, एक pre_save सिग्नल मदद करेगा। –

+1

नहीं, यह नहीं है। इस उत्तर में हालिया संपादन को वापस किया जाना चाहिए क्योंकि यह सही नहीं है। Django दस्तावेज़ों से: "ध्यान रखें कि अद्यतन() विधि सीधे SQL कथन में परिवर्तित हो जाती है। यह प्रत्यक्ष अपडेट के लिए एक बड़ा ऑपरेशन है। यह आपके मॉडल पर कोई सेव() विधियां नहीं चलाता है, या pre_save को छोड़ देता है या post_save सिग्नल "(स्रोत: https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once) – aggieNick02

0

ओवरराइटिंग save() विधि एक वैध समाधान है। get_prep_value() विधि को ओवरराइट करके Model स्तर के विपरीत Field स्तर पर मुझे इससे निपटने में उपयोगी पाया गया।

इस तरह यदि आप कभी भी इस क्षेत्र को एक अलग मॉडल में पुन: उपयोग करना चाहते हैं, तो आप एक ही संगत रणनीति को अपना सकते हैं। इसके अलावा तर्क को सहेजने के तरीके से अलग किया गया है, जिसे आप अलग-अलग उद्देश्यों के लिए ओवरराइट करना भी चाह सकते हैं।

इस मामले तो आप इस होगा के लिए:

class NameField(models.CharField): 
    def __init__(*args, **kwargs): 
     super(SnpField, self).__init__(*args, **kwargs) 

    def get_prep_value(self, value): 
     return str(value).lower() 

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=64) 
    name = NameField(max_length=200) 
    phone = models.CharField(max_length=20) 
    email = models.CharField(max_length=200) 
संबंधित मुद्दे