0

私はdjango 1.7 python 3.4を使用しています。AbstractBaseUserから派生したカスタムMyUserクラスを作成しました。ここで、ユーザーを登録しようとすると、'AnonymousUser' object has no attribute 'backend' というエラーが表示されます。ビュー.py

def signup(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if not form.is_valid():
            return "form invalid"  # render(request, 'auth/signup.html', {'form': form})
        else:

            email = form.cleaned_data.get('email')
            enterprise = form.cleaned_data.get('enterprise')
            first_name = form.cleaned_data.get('first_name')
            last_name = form.cleaned_data.get('last_name')
            password = form.cleaned_data.get('password')
            MyUser.objects.create_myuser(email=email, enterprise=enterprise, first_name=first_name, last_name=last_name,
                                         password=password,)
            myuser = authenticate(email=email, password=password)
            # myuser.backend = 'django.contrib.auth.backends.ModelBackend'
            # authenticate(email=email, password=password)
            login(request, myuser)
            welcome_post = u'{0}from {1} has joined the network.'.format(myuser.first_name, myuser.enterprise)
            node = Node(myuser=myuser, post=welcome_post)
            node.save()
            return redirect('/')
    else:
        return render(request, 'accounts/signup.html', {'form': SignupForm()})

また、ユーザーはデータベースに保存されません。

Traceback:
File "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\sp\ilog_dev\accounts\views.py" in signup
  27.             login(request, myuser)
File "C:\Python34\lib\site-packages\django\contrib\auth\__init__.py" in login
  98.     request.session[BACKEND_SESSION_KEY] = user.backend
File "C:\Python34\lib\site-packages\django\utils\functional.py" in inner
  225.         return func(self._wrapped, *args)

Exception Type: AttributeError at /accounts/signup/
Exception Value: 'AnonymousUser' object has no attribute 'backend'

models.py

class MyUserManager(BaseUserManager):
    def create_myuser(self, email, first_name, last_name, enterprise, password=None):
        if not email:
            raise ValueError('Users must have an email address')
        if not first_name:
            raise ValueError("must have a first_name")
        if enterprise not in Enterprise.objects.all():
            raise ValueError("please specify a valid enterprise or register a new one")

        myuser = self.model(email=self.normalize_email(email), first_name=first_name,
                            last_name=last_name, enterprise=enterprise,)

        myuser.set_password(password)
        myuser.save()  # using=self._db
        print("user saved")

        return myuser
4

2 に答える 2

0

ここでの問題は、認証モデルをデータベースに移行してから、2 番目のステップとしてカスタム ユーザーを移行したことです。

クリーンなデータベースから開始し、データベースに発行する最初の移行コマンドでカスタム ユーザーを移行する必要があります。

ドキュメントには、最初のステップとして常にカスタム ユーザー テーブルを作成する必要があることが記載されています。そうしないと、django 自体がねじれてしまいます。

警告

AUTH_USER_MODEL を変更すると、データベース構造に大きな影響があります。利用可能なテーブルを変更し、外部キーと多対多の関係の構築に影響を与えます。AUTH_USER_MODEL を設定する場合は、移行を作成する前、または manage.py migrate を初めて実行する前に設定する必要があります。

テーブルを作成した後にこの設定を変更することは、makemigrations ではサポートされていないため、手動でスキーマを修正し、古いユーザー テーブルからデータを移植し、場合によっては手動でいくつかの移行を再適用する必要があります。

于 2015-09-11T11:31:13.430 に答える