2016-10-02 13 views
1

デフォルトのdjango.contrib.auth.modelsユーザのユーザ名フィールドにスペースを入れることを許可しようとしていますが、他の人が直接または類似の質問を先に尋ねました:HereHere、およびHere。私はこれらの提案を実装しようとしましたが、これをどのように動作させるかの良い例を見つけることができないようです。Djangoのユーザー名正規表現でスペースを許可するにはどうすればよいですか?

私は、usernameフィールドのバリデーターで正規表現を変更する必要があることから、私はusernameの別のフィールドを実装し、独自の検証を提供する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で動作するはずです。

以下のユーザーでは、書いたフォームにUserの代わりにMyUserを使用することができます。

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 = MyValidatorusername_validator = MyValidator()にする必要があります。正規表現はr'^[\w\[email protected]+\- ]+$'\sは不要な場合があります)、.\.としてエスケープする必要があります。最終的なコードのようになります。あなたは、自分のUserクラスのフィールドを変更しているあなたは、おそらくAbstractUserをサブクラス化していて、使用できない場合

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. 

(Pythonの2を使用している場合、単純にASCIIUsernameValidatorUnicodeUsernameValidatorを置き換える)

proxy = True。つまり、の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

Pls。正規表現をrに変えてください^ [\ w \。@ + \ - \ s] + $ '編集が6文字以上でなければならないという愚かな規則のためにできません;) – pawelmech

+0

ありがとう、それ。私は愚かにも、正規表現の文字列を考えずにもう一方の答えをコピーしました。 –

関連する問題