2016-10-02 70 views
1

我試圖允許空格被接受到默認django.contrib.auth.models用戶的用戶名字段中,其他人在直接或類似問題之前提出了以下要求:Here,HereHere。我試圖實現這些建議,但我似乎無法找到一個很好的例子來說明如何使這個工作。如何在Django用戶名正則表達式中允許空格?

根據我的理解,我需要更改用戶名字段驗證程序中的正則表達式,爲此,我可以重寫來自contrib.auth.forms的UserCreationForm以實現用戶名的不同字段並提供自己的驗證。 (如this答案中的建議)。

我該怎麼做?

以供參考,這是目前我在用作爲註冊表單:

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

你正在運行哪個版本的Django? – Jonathan

+0

我的Django版本是1.10.1 –

回答

0

你需要修改的地方存在驗證用戶。下面的代碼應該適用於Django 1.9。

下面的這個用戶,你應該能夠使用MyUser而不是User作爲你寫的表單。

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. 

如果你想在Django 1.10中做到這一點,你必須稍微改變一下代碼。在Django 1.10中增加了一個新的屬性username_validator,你必須重寫它。您可以在manual中閱讀更多內容。

如果您使用python2,則必須覆蓋ASCIIUsernameValidator,或者如果您使用python3,則必須覆蓋UnicodeUsernameValidator。爲了簡單起見,我假設你使用的是python3。你可以看到驗證的源代碼here

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

謝謝你的迴應!不幸的是我的Django版本是1.10,它改變驗證器的方法類似? –

+0

我會用v1.10的示例更新我的答案 – Jonathan

+0

你去哪裏了,編輯爲v1.10。 – Jonathan

1

如果你是不是要修改默認的用戶類中的字段,其他喬納森的回答爲1.10後,除了一對夫婦的小失誤不錯。 username_validator = MyValidator需要username_validator = MyValidator()和正則表達式應該是r'^[\w\[email protected]+\- ]+$'\s匹配選項卡和其他可能不需要的空格,.需要轉義爲\.)。最終的代碼如下所示:

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. 

如果要修改您的用戶類中的字段,你可能繼承AbstractUser(簡單地ASCIIUsernameValidator如果使用Python 2取代UnicodeUsernameValidator),你不能使用proxy = True。這意味着AbstractUser上的username字段將使用AbstractUser上聲明的username_validator,而不是您的。爲了解決這個問題,你很可能在你的模型重新申報username,像這樣:

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."), 
     }, 
    ) 

確保您運行makemigrations事後遷移。

我已經嘗試了很多方法來改變驗證器的用戶名後,它已被宣佈,但沒有任何運氣,所以它看起來這是現在的最佳方式。

+0

請求。將正則表達式更改爲r'^ [\ w \。@ + \ - \ s] + $'我不能由於愚蠢的規則,編輯必須是6個字符或更多;) – pawelmech

+0

謝謝,我會重新測試幾件事那。我愚蠢地只是複製了另一個答案,而沒有考慮正則表達式字符串。 –

相關問題