2016-03-31 9 views
6

Jak ustawić domyślne charfield małymi literami? To jest mój model:Model Django - ustaw domyślny charfield małymi literami

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

Próbowałem __init__ ale to nie działa. Chcę, aby nazwa użytkownika była pisana małymi literami za każdym razem, gdy zapisano nowy rekord. Dzięki.

+0

możesz wypróbować ten http://stackoverflow.com/questions/2350681/django-lowercasecharfield – onerciller

Odpowiedz

9

Po prostu zrób to w metodzie zapisywania. tj. zastąpić klasę save klasy .

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

Ważne jest, aby podkreślić to tylko pomaga, gdy dany model aktualizacje przechodzą przez zapis. Jeśli napiszesz kod, który wykonuje .update() w zestawie zapytań, nie przechodzisz przez zapisywanie, więc nadal możesz otrzymać duże litery w polu bazy danych. – aggieNick02

+0

@ aggieNick02 w tym przypadku pomoże sygnał pre_save. –

+1

Nie, nie ma. Ostatnia zmiana tej odpowiedzi powinna zostać cofnięta, ponieważ nie jest poprawna. Z dokumentacji django: "Należy pamiętać, że metoda update() jest konwertowana bezpośrednio na instrukcję SQL.Jest to operacja zbiorcza dla bezpośrednich aktualizacji.Nie uruchamia żadnych metod save() w twoich modelach, ani nie wysyła pre_save lub sygnały post_save "(źródło: https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once) – aggieNick02

0

Podczas zastępowania save() metoda jest prawidłowym rozwiązaniem. Zauważyłem, że jest to przydatne na poziomie Field w przeciwieństwie do poziomu Model poprzez nadpisanie metody get_prep_value().

W ten sposób, jeśli chcesz ponownie użyć tego pola w innym modelu, możesz przyjąć tę samą spójną strategię. Również logika jest oddzielona od metody zapisu, którą możesz również nadpisać dla różnych celów.

W tym przypadku byłoby to:

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) 
Powiązane problemy