web-dev-qa-db-ja.com

AUTH_USER_MODELは、インストールされておらず、ログインできないAbstractUserモデルが作成されていないモデルを指します。

_AUTH_USER_MODEL_エラーはEDIT3で解決されました。パスワードは、フォームを介したユーザー作成時に保存されません。

Django 1.5を使用して、新しいユーザーオーバーライド/拡張​​機能で遊んでいますが、登録フォームで新しいユーザーを登録することはできません。管理者からのみ登録できます。フォーム、次のエラーが表示されます:

_Manager isn't available; User has been swapped for 'poker.PokerUser'_

models.py:

_class PokerUser(AbstractUser):
    poker_relate = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
    token = models.EmailField()
    USER_CHOICES = (
        ('1', 'Staker'),
        ('2', 'Horse')
    )
    user_type = models.CharField(choices=USER_CHOICES, max_length=10)
    username1 = models.CharField(null=True, blank=True, max_length=40)
    username2 = models.CharField(null=True, blank=True, max_length=40)
    username3 = models.CharField(null=True, blank=True, max_length=40)
    username4 = models.CharField(null=True, blank=True, max_length=40)
    username5 = models.CharField(null=True, blank=True, max_length=40)
_

PokerUserFormモデル:

_class PokerUserForm(UserCreationForm):
    class Meta:
        model = PokerUser
        fields = ('username','password1','password2','email','user_type','token','username1','username2','username3','username4','username5',)
_

_model = PokerUser_の代わりにget_user_model()を設定してモデルを明示的に定義する代わりにPokerUserFormモデルのモデルを変更してmodel = get_user_model()を使用しようとしましたが、次のエラーが表示されます。

_Django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed
_

私の_AUTH_USER_MODEL_は、私の_settings.py_に次のように設定されています:

_AUTH_USER_MODEL = 'poker.PokerUser'_

行く-_views.py_の登録ビュー:

_def UserRegistration(request):
    player = PokerUser()

    if request.method == 'POST':
        form = PokerUserForm(request.POST, instance=player)
        if form.is_valid():
            player.email_address = form.cleaned_data['email']
            player.user_type = form.cleaned_data['user_type']
            # if player is staker, token is their own email. otherwise their token is their staker's email and
            # their relation is their staker
            if player.user_type == '1' or player.user_type == 'staker':
                player.token = player.email_address
            else:
                player.token = form.cleaned_data['token']
                staker = PokerUser.objects.get(email=player.token)
                player.poker_relate = staker
            player.save()
            return HttpResponseRedirect('/')
    else:
        form = PokerUserForm()
    initialData = {'form': form}
    csrfContext = RequestContext(request, initialData)
    return render_to_response('registration/register.html', csrfContext)
_

EDIT1:

ドキュメントによればUserCreationFormは、カスタムユーザークラスで使用するために再作成する必要があります。

次のようにUserCreationForm全体をオーバーライドしました。

_class UserCreationForm(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'duplicate_username': _("A user with that username already exists."),
        'password_mismatch': _("The two password fields didn't match."),
        }
    username = forms.RegexField(label=_("Username"), max_length=30,
        regex=r'^[\w.@+-]+$',
        help_text=_("Required. 30 characters or fewer. Letters, digits and "
                    "@/./+/-/_ only."),
        error_messages={
            'invalid': _("This value may contain only letters, numbers and "
                         "@/./+/-/_ characters.")})
    password1 = forms.CharField(label=_("Password"),
        widget=forms.PasswordInput)
    password2 = forms.CharField(label=_("Password confirmation"),
        widget=forms.PasswordInput,
        help_text=_("Enter the same password as above, for verification."))

    class Meta:
        model = PokerUser
        fields = ('username','password1','password2','email','user_type','token','username1','username2','username3','username4','username5',)

    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            PokerUser.objects.get(username=username)
        except PokerUser.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(
                self.error_messages['password_mismatch'])
        return password2

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user
_

そして、これはこのエラーを解決することができました:

_The Manager isn't available; User has been swapped for 'poker.PokerUser'_

これで、ユーザーは作成されますが、ログインできません。管理者でユーザーを確認すると、パスワードを除くすべての情報が正しいようです。 adminでパスワードを手動で追加しても、正しく機能しないようです。それでも、管理者を介してユーザーを追加しても正常に機能します。

編集2:

登録フォームで作成したAbstractUserモデルのいずれとしてもログインできません。上記のUserCreationFormを完全にオーバーライドしましたが、このエラーでget_user_model()を実装できません。

_AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed_

Django get_user_model()のコードは:

_ def get_user_model():
    "Return the User model that is active in this project"
    from Django.conf import settings
    from Django.db.models import get_model

    try:
        app_label, model_name = settings.AUTH_USER_MODEL.split('.')
    except ValueError:
        raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
    user_model = get_model(app_label, model_name)
    if user_model is None:
        raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)
    return user_model
_

_AUTH_USER_MODEL = 'poker.PokerUser'_に_settings.py_のセットアップがあるので、これは動作するはずです。 Djangoコンソールでこれを確認しました:

_>>> from Django.contrib.auth import get_user_model
>>> settings.AUTH_USER_MODEL
Out[14]: 'poker.PokerUser'
>>> from Django.db.models import get_model
>>> app_label, model_name = settings.AUTH_USER_MODEL.split('.')
>>> user_model = get_model(app_label, model_name)
>>> user_model
Out[18]: poker.models.PokerUser
_

ただし、実装はまだ正しく動作しません。

ここまで読んだことがあれば、ありがとう!

EDIT3:

_AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed_が修正されました。誤って_poker.models_の代わりに_registration.forms_で再作成したUserCreationFormがあったため、_poker.PokerUser_に割り当てられたget_user_model()を実行すると、既にその場所にあったため、解決しません。

現在残っている唯一の問題は、新しいユーザーを作成するときにパスワードが保存されないことです。ここにprintステートメントを配置することで、UserCreationForm内の単一のメソッドに絞り込みました。

_def clean_password2(self):
    password1 = self.cleaned_data.get("password1")
    print password1
    password2 = self.cleaned_data.get("password2")
    print password2
    if password1 and password2 and password1 != password2:
        raise forms.ValidationError(
            self.error_messages['password_mismatch'])
    print password2
    return password2

def save(self, commit=True):
    user = super(UserCreationForm, self).save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    print self.cleaned_data["password1"]
    if commit:
        user.save()
    return user
_

_print password1_の_print password1_および_clean_password2_ステートメントはプレーンテキストパスワードを表示しますが、saveメソッドの_print self.cleaned_data["password1"]_は空白です。フォームデータがsaveメソッドに渡されないのはなぜですか?

TL; DRAbstractUserモデルの作成は管理者と登録フォームの両方で機能していますが、管理者で作成したユーザーのみがログインできます。登録フォームを介して作成されたユーザーはログインできず、パスワードなしで保存されているようです-他のすべての情報は正しく保存されています。

24
Dan Hoerst

ここには3つの問題があったので、最初の2つは他の誰かのために出てくると確信しているので、それらすべてに対処します。

  • _Manager isn't available; User has been swapped for 'poker.PokerUser'_

これは、UserCreationFormを使用しているが再作成していないためです。 1.5でカスタムモデルを使用する場合、一部のモデルフォームはそのまま使用できますが、これを再作成する必要があります。ドキュメントについては here をご覧ください。

  • _The Manager isn't available; User has been swapped for 'poker.PokerUser'_

_AUTH_USER_MODEL = 'poker.PokerUser'_を_settings.py_に設定している間に、_poker.models_の場所からget_user_model()を呼び出していました。別の場所からget_user_model()を呼び出す必要があります。フォームを_registration.forms_に移動し、そこからget_user_model()を呼び出すと正常に機能しました。

  • 新しいユーザーは保存していません

これは私の頭の中でただのオナラでした。 UserRegistrationモデルでは、フォームのさまざまなフィールドを操作していました。 save()メソッドのUserCreationFormにこれらのフィールドを渡したとき、パスワードフィールドを渡してはいませんでした。おっと!

14
Dan Hoerst

私はこれに何度か遭遇しました。これは常にインポートの問題でした。カスタムユーザーを実装し、別のファイル(Elseなど)からシンボルをインポートするcore/models.pyがあるとします。

from Something import Else

class CustomUser(AbstractBaseUser):
    pass

そして、CustomUserを使用し、Elseを定義する別のファイルがあります。これをsomething/models.pyと呼びましょう:

from core.models import CustomUser

class Else(models.Model):
    pass

class AnotherClass(models.model):
    user = models.ForeignKey(CustomUser)

Core/models.pyがElseをインポートすると、something/models.pyが評価され、AnotherClass定義が実行されます。 AnotherClassはCustomUserを使用しますが、CustomUserは作成中のため、まだインストールされていません。そのため、このエラーがスローされます。

Core/models.pyをスタンドアロンのままにして、この問題を解決しました。私の他のアプリからはあまりインポートしません。

14
Rob Jones

私のケースでは、メタの適切なapp_labelでこの問題を解決しました

class APPUser(AbstractUser):
   password = models.TextField(blank=True)

   class Meta:
     app_label = 'app_auth'
     db_table = "app_user"
2
naren

設定でアプリを登録するのを忘れた場合に発生する可能性があります。 settings.pyファイルで、INSTALLED_APPSのリストにアプリの名前を追加します。これがお役に立てば幸いです。

たとえば、アプリ名が「ユーザー」の場合、次のようになります。

INSTALLED_APPS = [
  ......

  'users'
]
1
Reticent