2016-03-31 27 views
6

Come impostare il campo di lavoro predefinito in lettere minuscole? Questo è il mio modello:Modello Django - imposta il campo di lavoro predefinito in minuscolo

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

Ho provato il __init__ ma non funziona. Voglio rendere il nome utente in minuscolo ogni volta che viene salvato un nuovo record. Grazie.

+0

si può provare un tale http://stackoverflow.com/questions/2350681/django-lowercasecharfield – onerciller

risposta

9

Basta farlo nel metodo di salvataggio. cioè, sovrascrivi il metodo save della classe Model.

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

E 'importante sottolineare questo aiuta solo quando il tuo modello gli aggiornamenti passano attraverso il salvataggio. Se scrivi un codice che fa un .update() su un queryset, non passi attraverso il salvataggio, quindi puoi ancora finire con lettere maiuscole nel campo del tuo database. – aggieNick02

+0

@ aggieNick02 per questo caso, un segnale pre_save aiuterà. –

+1

No, non è così. La modifica recente a questa risposta dovrebbe essere ripristinata poiché non è corretta. Da django docs: "Si tenga presente che il metodo update() viene convertito direttamente in un'istruzione SQL, è un'operazione bulk per gli aggiornamenti diretti, non esegue alcun metodo save() sui propri modelli, né emette il pre_save o segnali post_save "(fonte: https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once) – aggieNick02

0

Mentre la sovrascrittura del metodo save() è una soluzione valida. Ho trovato utile trattare questo su un livello in contrasto con il livello Model sovrascrivendo il metodo get_prep_value().

In questo modo, se si desidera riutilizzare questo campo in un modello diverso, è possibile adottare la stessa strategia coerente. Anche la logica è separata dal metodo di salvataggio, che potresti anche voler sovrascrivere per diversi scopi.

Per questo caso si sarebbe questo:

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)