【问题标题】:Manager isn't available; 'auth.User' has been swapped for 'polls.User'经理不可用; 'auth.User' 已替换为 'polls.User'
【发布时间】:2018-07-27 04:12:27
【问题描述】:

我创建了一个不同版本的用户模型,其中没有用户名字段,我现在正在尝试实现登录功能,但我不断收到错误

Manager isn't available; 'auth.User' has been swapped for 'polls.User'

我已经搜索了该站点的其余部分,并尝试实施下面的功能来解决问题,但无济于事。

from django.contrib.auth import get_user_model

User = get_user_model()

这是我剩下的文件

观看次数

    from django.http import HttpResponse
    from django.shortcuts import get_object_or_404, render, render_to_response, redirect
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth import login, authenticate
    from django.shortcuts import render, redirect

    from polls.forms import SignUpForm
    from django.contrib.auth import get_user_model

    User = get_user_model()

    @login_required
    def home(request):
        return render(request, 'home.html')

    def signup(request):
        if request.method == 'POST':
            form = SignUpForm(request.POST)
            if form.is_valid():
                form.save()
                username = None
                raw_password = form.cleaned_data.get('password1')
                user = authenticate(password=raw_password)
                login(request, user)
                return redirect('home')
        else:
            form = SignUpForm()
        return render(request, 'signup.html', {'form': form})

表格

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
    username = None

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password1', 'password2', )

型号

from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import ugettext_lazy as _

class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular User with the given email and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)


class User(AbstractUser):
    """User model."""

    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

如果有人能提供任何澄清,将不胜感激

【问题讨论】:

    标签: python django


    【解决方案1】:

    在您的 forms.py 中,您还必须更改

    from django.contrib.auth.models import User
    

    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    

    这适用于您使用User 的任何地方。错误的回溯将告诉您错误的确切位置。在寻求帮助调试时,请始终在问题中包含回溯。

    【讨论】:

    • 谢谢!!!我发现了其他几篇具有类似解决方案的帖子,没有人能够编写一个没有胡言乱语的简单解决方案。感谢您保持简单! - 这立即解决了我的问题。
    【解决方案2】:

    编辑: 没关系,请参阅 Håken Lid 的答案。我看错了问题。

    但是,您还必须修复下面的代码


    取决于你使用的 Django 版本,但问题出在这一行:

    user = authenticate(password=raw_password)
    

    您还应该传递用户名:

    user = authenticate(username='john', password='secret')
    

    然后,authenticate 方法将返回 User 实例或 None

    if user is not None:
        login(request, user)
    else:
        # authenticated failed
    

    【讨论】:

    • 谢谢你,Vitor,当你说 username='john', password='secret' 时,我假设转换为 username=username, password=raw_password。如果这是一个愚蠢的问题,我深表歉意我在 Django 还很新
    • 是的,没错,您将使用 usernameraw_password。但在您的情况下,您可能需要传递电子邮件,而不是用户名。因为您从模型中删除了用户名。
    • 这看起来像来自 Practical Django 2 和 Channels 2 的代码
    【解决方案3】:

    看看这里它已被其他人解决。 [stackoverflow上的解决方案Link

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2019-07-20
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2018-04-21
      • 1970-01-01
      相关资源
      最近更新 更多