2016-12-05 23 views
1

Django 1.10を使用しています私は 'django.contrib.auth.middleware.RemoteUserMiddleware'を利用しているWindows環境で作業しているので、ユーザ名に\文字を許可したいと思います。ドメイン\ユーザー名(私はドメインをいくつかのビジネスロジックで使用されているようにドロップする必要はありません)。DjangoはASCIIUsernameValidatorを上書きします

私はジャンゴ\のcontrib \認証\ validators.py簡単に十分と希望しているを変更することができますがregex = r'^[\[email protected]+-\\]+$'するラインregex = r'^[\[email protected]+-]+$'を修正することによって影響を与えるしかし、私は1つは簡単にこのクラスをオーバーライドすることができると思ったが、私は失敗しました。

私は(ここではSO上と同様の他の多くの)いくつかの有用なリンクを見つけた:

https://stackoverflow.com/a/39820162/4872140

https://stackoverflow.com/a/1214660/4872140

https://docs.djangoproject.com/en/1.10/releases/1.10/#official-support-for-unicode-usernames https://docs.djangoproject.com/en/1.10/ref/contrib/auth/#django.contrib.auth.models.User.username_validator

しかし、情報を日付、またはdoesnのさ最後の2つのケースでは、問題を解決する方法を正確に/完全に示していません。私は、AUTH_USER_MODELの変更が魅力的ではないので、アプリにうまくいきます。 settings.py:

AUTH_USER_MODEL = 'myapp.MyUser' 

私は、「スワップモデル 『myapp.DomainUser』プロキシすることはできません」というエラーになり、次のようなユーザー・モデルにプロキシを使用することができるかもしれ考えて、とにかく試してみました:

class DomainASCIIUsernameValidator(ASCIIUsernameValidator): 
    regex = r'^[\[email protected]+-\\]+$' 

class DomainUser(User): 
    username_validator = DomainASCIIUsernameValidator() 

    class Meta: 
     proxy = True 

正規表現をASCIIUsernameValidator(およびUnicodeUsernameValidator)に置き換える方法は、Userモデルをそのままにしてください。 https://docs.djangoproject.com/en/1.10/ref/contrib/auth/#django.contrib.auth.models.User.username_validatorで説明されているようにユーザーモデルをサブクラス化する場合は、AUTH_USER_MODELでそのモデルを指定していますか?

私はhttps://groups.google.com/forum/#!topic/django-developers/MBSWXcQBP3k/discussionのディスカッションを読んでおり、最初からカスタムユーザーを作成するとデフォルトのケースになるように感じるかもしれません。

答えて

4

これは私には一日も多くの答えがありました。コードを別の部分に分割しました。まず、私たちは私たちのバリデータを持っている:

validators.py

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


class DomainUnicodeUsernameValidator(UnicodeUsernameValidator): 
    """Allows \.""" 
    regex = r'^[\[email protected]+-\\]+$' 
    message = _(
     'Enter a valid username. This value may contain only letters, ' 
     'numbers, and \/@/./+/-/_ characters.' 
    ) 

私も\が許可されたと言うために、メッセージの変更を追加しました。 DomainASCIIUsernameValidatorを簡単に追加することもできます。

models.py

from django.contrib.auth.models import User 

from .validators import DomainUnicodeUsernameValidator 


class DomainUser(User): 
    class Meta: 
     proxy = True 

    def __init__(self, *args, **kwargs): 
     self._meta.get_field(
      'username' 
     ).validators[0] = DomainUnicodeUsernameValidator() 

     super().__init__(*args, **kwargs) 

これは、我々が以前に設定したバリデータをつかみます。また、デフォルトユーザをプロキシし、ユーザ名フィールドのバリデータを設定します。バリデーターを新しいバリデーターと最大長のバリデーターを含むリストとして設定することができます(おそらく、オーダーが変更された場合に安全です)。ここで

forms.py

from django.contrib.auth.forms import UserChangeForm 
from django.utils.translation import ugettext_lazy as _ 

from .models import DomainUser 


class DomainUserChangeForm(UserChangeForm): 
    class Meta(UserChangeForm.Meta): 
     model = DomainUser 
     help_texts = { 
      'username': _('Required. 150 characters or fewer. Letters, digits and \/@/./+/-/_ only.'), # NOQA 
     } 

、私はUserChangeFormを拡張し、ユーザー名の検証の変更とプロキシモデルにモデルを設定しています。

ユーザーがユーザー名を\で追加できるようにするには、同様にUserAddFormも変更する必要があります。

最後には、admin.py

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.models import User 

from .forms import DomainUserChangeForm 


class DomainUserAdmin(UserAdmin): 
    form = DomainUserChangeForm 


admin.site.unregister(User) 
admin.site.register(User, DomainUserAdmin) 

に私たちは、Djangoの管理ページで使用される当社の管理のためのフォームを設定します。 User adminの設定を解除し、カスタムDomainUserAdminに置き換えます。

+0

うわー!私はちょうど新しいプロジェクトに着手しました。そして、私は次の日にこのプロジェクトにこのプロジェクトを打ち出します。 – AMG

+0

新しいプロジェクトを開始する場合は、新しいユーザーモデルを作成することをお勧めします。彼らはそれをお勧めします[リンク](https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model): _新しいプロジェクトを開始する場合は、デフォルトのユーザーモデルで十分である場合でも、カスタムユーザーモデルを設定することを強くお勧めします。このモデルはデフォルトのユーザーモデルと同じように動作しますが、必要に応じて将来的にカスタマイズすることができます:_。 –

関連する問題