2016-03-31 37 views
6

Varsayılan charfield nasıl küçük harf olarak ayarlanır? Bu benim modelidir: Django model - varsayılan kareyi varsayılan olarak ayarlayın

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() 

Ben __init__ çalıştım ama çalışmıyor. Yeni kayıt her kaydedildiğinde kullanıcı adını küçük harfle yapmak istiyorum. Teşekkürler.

+0

Eğer deneyebilirsiniz bir bu http://stackoverflow.com/questions/2350681/django-lowercasecharfield – onerciller

cevap

9

Sadece kaydetme yönteminde yapın. Yani Model sınıfının save yöntemini geçersiz kılın.

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

O zaman modeli bu sadece yardımcı işaret etmek önemlidir güncellemeler kayıttan geçer. Bir queryset üzerinde bir .update() kodu yazıyorsanız, kaydetme işleminden geçmezsiniz, bu nedenle veritabanı alanınızda büyük harflerle sonuçlanabilir. Bu durumda – aggieNick02

+0

@ aggieNick02, bir pre_save sinyali yardımcı olacaktır. –

+1

Hayır, öyle değil. Bu cevaba yapılan son düzenleme, doğru olmadığı için geri alınmalıdır. Django dokümanlarından: "Güncelleme() yönteminin doğrudan bir SQL ifadesine dönüştürüldüğünü unutmayın. Doğrudan güncellemeler için toplu bir işlemdir. Modellerinizde herhangi bir save() yöntemi çalıştırmaz veya pre_save veya post_save sinyalleri "(kaynak: https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once) – aggieNick02

0

save() yöntemi üzerine yazma sırasında geçerli bir çözümdür. Model düzeyinin get_prep_value() yönteminin üzerine yazarak Field seviyesinde bununla başa çıkmayı faydalı buldum.

Bu şekilde, bu alanı farklı bir modelde yeniden kullanmak isterseniz, aynı tutarlı stratejiyi uygulayabilirsiniz. Ayrıca mantık, farklı amaçlar için üzerine yazmak isteyebileceğiniz kaydetme yönteminden ayrılır. Bu olur Bu durum için

:

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) 
İlgili konular