100 error solved in EDIT3. Passwords still will not save on user creation via form.

我正在使用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',)

我试图将PokerUserForm模型中的模型更改为使用get_user_model(),而不是通过设置model = get_user_model()而不是model = PokerUser来显式定义模型,但随后收到以下错误:

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

My AUTH_USER_MODEL是在My 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:

According to the docs,则必须重新创建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'

现在,用户已创建,但无法登录.当我在管理员中判断用户时,除了密码之外,所有的信息似乎都是正确的.在管理员中手动添加密码似乎无法正常工作.不过,通过管理员添加用户仍然可以正常工作.

EDIT 2:

我仍然无法以任何通过注册表创建的AbstractUser模型登录.我已经完全覆盖了上面概述的UserCreationForm,并且无法实现 get_user_model(),并出现此错误:

AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed

get_user_model()的Django代码是:

 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

Since I have AUTH_USER_MODEL = 'poker.PokerUser'个 setup in my settings.py, this should work. I've verified this through the Django console:

>>> 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个 has been fixed. I accidentally had the UserCreationForm that I recreated in poker.models instead of registration.forms, so when I ran get_user_model() that was assigned to poker.PokerUser, it couldn't resolve since it was already in that location.

现在剩下的唯一问题是,在创建新用户时,他们的密码将不会保存.通过将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

clean_password2中的print password1print password1语句显示纯文本密码,但save方法中的print self.cleaned_data["password1"]为空.为什么我的表单数据没有被传递到save方法?

TL;DR AbstractUser模型创建同时在管理员和VIA注册表中工作,但只有通过Admin创建的用户才能登录.通过注册表创建的用户无法登录,并且似乎是在没有密码的情况下保存的-所有其他信息都已正确保存.

推荐答案

这里对我来说有三个问题,所以我将全部解决,因为我非常确定前两个问题会出现在其他人身上.

  • 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'

当我的settings.py里有AUTH_USER_MODEL = 'poker.PokerUser'台的时候,我从poker.models的位置拨打了get_user_model().您必须从不同的位置拨打get_user_model().将我的表单移到registration.forms并从那里拨打get_user_model()可以正常工作.

  • 新用户未保存

这只是我那头的一次脑筋急转弯.在我的UserRegistration模型中,我正在操作表单中的各个字段.当我将这些字段传递回save()方法的UserCreationForm时,我没有随同它一起传递密码字段.哎呀!

Django相关问答推荐

Django Signals:从实例访问ManyToManyRel值

如何在Django中将字段及其数据从一个模型添加到另一个模型?

Django 身份验证系统修改

Django:想要将一个空字段显示为空白而不是显示无

Django PositiveIntegerField 中的 0 值?

如何访问 Django Rest Framework 上的自定义 HTTP 请求标头?

如何在终端中切换 Python 版本?

如何测试某个日志(log)消息是否记录在 Django 测试用例中?

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

django - pisa:将图像添加到 PDF 输出

Django:从视图中添加 non_field_error?

有日期时间±无穷大吗?

如何以编程方式对 Django 中的用户进行身份验证?

PyCharm 代码判断提示找不到模板文件,如何解决?

您如何在本地针对 OpenID 进行开发

过滤查询参数

Django - TypeError - save() 得到了一个意外的关键字参数force_insert

它是如何工作的,Django INSTALLED_APPS 的命名约定?

AttributeError:ManyRelatedManager对象没有add属性?

Django REST 框架中的每个字段权限