2012-12-16 23 views
5

Mi sento piuttosto stupido per averlo chiesto, ma lo farò comunque. Il riferimento API 'Users' nella documentazione di Django "User authentication in Django" (v. 1.4) dice che un nome utente può contenere solo lettere, cifre e caratteri @, +,., - e _. Eppure posso entrare nella shell Python e fare il seguente:Perché model.User consente caratteri non validi nel nome utente?

>>> from django.contrib.auth.models import User 
>>> u = User.objects.create_user('joe#') 

Perché questo non fa sorgere un'eccezione? Ho guardato il codice sorgente in ../contrib/auth/models.py e non sembra che stia contrassegnando caratteri non validi. Cosa sta succedendo qui? Sembrerebbe che se si vuole catturare un nome utente errato, si dovrebbe farlo attraverso la convalida del modulo.

risposta

4

Immagino che gli sviluppatori volessero fornire agli sviluppatori di applicazioni la flessibilità necessaria per poter memorizzare simboli speciali. Quindi, invece di convalidare gli input a livello di modello, è fatto nella forma. È possibile trovare il modulo all'interno django.contrib.auth.form.UserCreationForm

Il frammento è qui:

si può vedere la convalida uso delle espressioni regolari sul campo Nome utente.

class UserCreationForm(forms.ModelForm): 
    """ 
    A form that creates a user, with no privileges, from the given username and 
    password. 
    """ 
    error_messages = { 
     'duplicate_username': _("A user with that username already exists."), 
     'password_mismatch': _("The two password fields didn't match."), 
    } 
    username = forms.RegexField(label=_("Username"), max_length=30, 
     regex=r'^[\[email protected]+-]+$', 
     help_text = _("Required. 30 characters or fewer. Letters, digits and " 
         "@/./+/-/_ only."), 
     error_messages = { 
      'invalid': _("This value may contain only letters, numbers and " 
         "@/./+/-/_ characters.")}) 
    password1 = forms.CharField(label=_("Password"), 
     widget=forms.PasswordInput) 
    password2 = forms.CharField(label=_("Password confirmation"), 
     widget=forms.PasswordInput, 
     help_text = _("Enter the same password as above, for verification.")) 
+0

Vedo. Grazie mille, Raunak! – William

+0

L'espressione regex nel codice include il carattere di sottolineatura? – Fydo

+0

Non penso che sia una buona idea per loro poiché crea incoerenza. Vedi [questo problema] (https://github.com/pennersr/django-allauth/issues/1321) –

Problemi correlati