2012-12-16 9 views
5

Czuję się dość głupio, gdy o to pytam, ale i tak to zrobię. Odwołanie do interfejsu API "Użytkownicy" w dokumentacji Django "User authentication in Django" (w. 1.4) mówi, że nazwa użytkownika może zawierać tylko litery, cyfry i znaki @, +,., - i _. Mimo to mogę przejść do powłoki Python i wykonać następujące czynności:Dlaczego models.User dopuszcza nieprawidłowe znaki w nazwie użytkownika?

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

Dlaczego to nie powoduje wyjątku? Spojrzałem na kod źródłowy w ../contrib/auth/models.py i nie wydaje się, aby zgłaszał nieprawidłowe znaki. Co tu się dzieje? Wygląda na to, że jeśli chcesz złapać błędną nazwę użytkownika, musisz to zrobić poprzez weryfikację formularza.

Odpowiedz

4

Wydaje mi się, że programiści chcieli zapewnić programistom aplikacji elastyczność, dzięki czemu możemy przechowywać specjalne symbole. Zamiast sprawdzania danych wejściowych na poziomie modelu odbywa się to w formularzu. Można znaleźć formę wewnątrz django.contrib.auth.form.UserCreationForm

Fragment jest tutaj:

można zobaczyć walidacji za pomocą wyrażeń regularnych w polu Nazwa użytkownika.

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

Rozumiem. Wielkie dzięki, Raunak! – William

+0

Czy wyrażenie regex w kodzie zawiera znak podkreślenia? – Fydo

+0

Nie myśl, że to dobry pomysł, ponieważ powoduje to niespójność. Zobacz [ten numer] (https://github.com/pennersr/django-allauth/issues/1321) –

Powiązane problemy