2016-10-02 2 views
1

Ich versuche zu akzeptieren, dass Leerzeichen in das Feld Benutzername des voreingestellten Benutzers django.contrib.auth.models akzeptiert werden, andere Leute haben direkt oder ähnliche Fragen vorher gefragt: Here, Here und Here. Ich habe versucht, diese Vorschläge umzusetzen, aber ich kann kein gutes Beispiel dafür finden, wie ich das umsetzen kann.Wie kann ich Leerzeichen in einem Django-Benutzernamen Regex zulassen?

Von was ich verstehe, muss ich die Regex im Feld Validator Benutzername ändern, um dies zu tun, kann ich die UserCreationForm von contrib.auth.forms überschreiben, um ein anderes Feld für den Benutzernamen zu implementieren und meine eigene Validierung. (wie in this Antwort vorgeschlagen).

Wie konkret mache ich das?

als Referenz, ist dies zur Zeit, was ich als Anmeldeformular bin mit:

class SignUpForm(forms.ModelForm): 
    """ 
    This form class is for creating a player 
    """ 
    username = forms.CharField(label='Gamertag', max_length=16, widget=forms.TextInput(attrs={'placeholder': 'Gamertag', 'class': 'form-input'})) 
    email = forms.EmailField(label='email', widget=forms.TextInput(attrs={'placeholder': 'Email', 'class': 'form-input', 'type':'email'})) 
    password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password', 'class': 'form-input'})) 

    class Meta: 
     model = User 
     fields = ['username', 
        'email', 
        'password'] 
     widgets = { 
      'password': forms.PasswordInput(), 
     } 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     username = self.cleaned_data.get('username') 
     if email and User.objects.filter(email=email).exclude(username=username).count(): 
      raise forms.ValidationError(u'A user with that email already exists.') 
     return email 
+0

Welche Version von Django liegst du? – Jonathan

+0

Meine Version von Django ist 1.10.1 –

Antwort

0

Sie müssen die Benutzer ändern, wenn der Validator vorhanden ist. Der folgende Code sollte für Django 1.9 funktionieren.

Mit diesem Benutzer sollten Sie in der Lage sein, MyUser statt User für das Formular zu verwenden, das Sie geschrieben haben.

from django.contrib.auth.models import AbstractUser 
from django.core import validators 

class MyUser(AbstractUser): 
    validators=[ 
       validators.RegexValidator(
        r'^[\[email protected]+-\s]+$', 
        _('Enter a valid username. This value may contain only ' 
         'letters, numbers, spaces ' 'and @/./+/-/_ characters.') 
       ), 
      ], 

    class Meta: 
     proxy = True # If no new field is added. 

Wenn Sie es in Django 1.10 tun möchten, müssen Sie den Code leicht ändern. In Django 1.10 wurde eine neue Eigenschaft hinzugefügt username_validator und Sie müssen dies überschreiben. Sie können mehr darüber in der manual lesen.

Wenn Sie Python2 verwenden, müssen Sie ASCIIUsernameValidator überschreiben, oder wenn Sie Python3 verwenden, müssen Sie UnicodeUsernameValidator überschreiben. Der Einfachheit halber nehme ich an, dass Sie python3 verwenden. Sie können den Quellcode der Validierung here sehen.

from django.contrib.auth.models import User 
from django.contrib.auth.validators import UnicodeUsernameValidator 

class MyValidator(UnicodeUsernameValidator): 
    regex = r'^[\[email protected]+-\s]+$' 

class MyUser(User): 
    username_validator = MyValidator 

    class Meta: 
     proxy = True # If no new field is added. 
+0

Vielen Dank für Ihre Antwort! leider ist mein Django Version 1.10, ist es die Methode den Validator ähnlich zu ändern? –

+0

Ich werde meine Antwort mit einem Beispiel für v1.10 – Jonathan

+0

aktualisieren Gehen Sie, Bearbeitungen für v1.10. – Jonathan

1

Wenn Sie nicht versuchen, die Felder auf der Standard-Benutzerklasse zu ändern, die anderen Jonathan Antwort für die Zeit nach 1.10 ist gut, außer für ein paar kleine Fehler. username_validator = MyValidator muss username_validator = MyValidator() sein und die Regex sollte r'^[\w\[email protected]+\- ]+$' sein (\s Übereinstimmungen mit Tabs und anderen Leerstellen, die Sie möglicherweise nicht wollen und . muss als \. maskiert werden). Der endgültige Code wie folgt aussieht:

from django.contrib.auth.models import User 
from django.contrib.auth.validators import UnicodeUsernameValidator 

class MyValidator(UnicodeUsernameValidator): 
    regex = r'^[\w\[email protected]+\- ]+$' 

class MyUser(User): 
    username_validator = MyValidator() 

    class Meta: 
     proxy = True # If no new field is added. 

(einfach UnicodeUsernameValidator mit ASCIIUsernameValidator ersetzen Python bei Verwendung von 2)

Wenn Sie die Felder auf der Benutzerklasse modifizieren, sind Sie wahrscheinlich AbstractUser Subklassen und Sie können nicht verwenden proxy = True. Das bedeutet, dass das username Feld auf AbstractUser das username_validator verwendet, das auf AbstractUser deklariert wird, nicht deins. Um dies zu beheben, müssen Sie ziemlich neu erklären username nach Modell, etwa so:

from django.contrib.auth.models import AbstractUser 
from django.contrib.auth.validators import UnicodeUsernameValidator 
from django.utils.translation import ugettext_lazy as _  

class MyValidator(UnicodeUsernameValidator): 
    regex = r'^[\w\[email protected]+\- ]+$' 

class MyUser(AbstractUser): 
    username_validator = MyValidator() 
    username = models.CharField(
     _('username'), 
     max_length=150, 
     unique=True, 
     help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 
     validators=[username_validator], 
      error_messages={ 
      'unique': _("A user with that username already exists."), 
     }, 
    ) 

Stellen Sie sicher, laufen makemigrations und wandern danach.

Ich habe versucht eine Reihe von Möglichkeiten, um die Validatoren für den Benutzernamen zu ändern, nachdem es bereits erklärt wurde, aber noch kein Glück gehabt, so sieht es aus wie dies der beste Weg für jetzt ist.

+0

Pls. Ändern Regex in r '^ [\ w \. @ + \ - \ s] + $' Ich kann nicht wegen alberner Regel, dass Änderungen müssen 6 Zeichen oder mehr sein;) – pawelmech

+0

Danke, ich werde ein paar Dinge mit wiederholen Das. Ich habe dummerweise einfach die andere Antwort kopiert, ohne über die Regex-Zeichenfolge nachzudenken. –

Verwandte Themen