使用自定义用户模型的Django用户注册

3
我想为使用abstractuser的Django自定义用户模型创建注册表格。我不需要任何特殊功能,只是在需要时能够添加自定义字段。
我从文档中了解到,我需要:
  • 设置AUTH_USER_MODEL
  • 通过继承AbstractUser来定义自定义用户模型
  • 通过继承UserManager来定义自定义模型管理器
  • 子类化UserCreationFormUserChangeForm
这是我的当前代码:
我的settings.py:
AUTH_USER_MODEL = 'users.CustomUser'

我的models.py文件:

from django.contrib.auth.models import AbstractUser, UserManager


class CustomUserManager(UserManager):
    pass    

class CustomUser(AbstractUser):
    objects = CustomUserManager()

我的forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = UserCreationForm.Meta.fields

class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = UserChangeForm.Meta.fields

我的admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser


class CustomUserAdmin(UserAdmin):
    model = CustomUser
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm


admin.site.register(CustomUser, CustomUserAdmin)

我的views.py文件:

from django.urls import reverse_lazy
from django.views import generic

from .forms import CustomUserCreationForm

class SignUp(generic.CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'signup.html'

提交注册表单时出现错误信息:
OperationalError at /users/signup/
no such table: users_customuser

我已经清空了我的数据库并从头开始执行了 makemigrationsmigrate。我的表单可能有问题,管理员也可能有问题。


你在 admin.py 中注册了吗?https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project - schrodingerscatcuriosity
是的,忘记添加那段代码了。现在已经包含进去了。 - wsvincent
这个答案可能会对你有所帮助:链接 - raratiru
哈,谢谢。我认为问题在于需要从头开始重写UserCreationForm。 - wsvincent
对于那些好奇的人,我写了一个教程,介绍如何使用自定义用户模型与Django解决此问题。https://wsvincent.com/django-custom-user-model-tutorial/ - wsvincent
显示剩余4条评论
1个回答

4

查看Django文档有关重写用户模型的内容:引用用户模型

但是,如果您的用户模型扩展了AbstractBaseUser,则需要定义自定义ModelAdmin类。

在admin.py中,您应该从django.contrib.auth获取用户模型:

admin.py:

from django.contrib.auth import get_user_model

Class MyCustomModelAdmin...

CustomUser = get_user_model()

admin.site.register(CustomUser, MyCustomModelAdmin)

编辑:我认为问题可能出在您使用UserCreationForm上。

我的forms.py文件:

from django import forms
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

class Meta:
    model = CustomUser
    fields = [list fields here]

我认为你已经找到了问题所在,但是我无法让你的解决方案起作用。我已经更新了上面的代码以显示修改后的admin.py,但仍然出现相同的错误:“Manager isn't available; 'auth.User' has been swapped for 'users.CustomUser'。” - wsvincent
抱歉,我忽略了你只是使用AbstractUser而不是AbstractBaseUser。 - Stolson
由于我使用的是 AbstractUser 而不是 AbstractBaseUser,因此我尝试根据文档仅扩展 UserAdmin。 "如果您的自定义用户模型扩展了django.contrib.auth.models.AbstractUser,则可以使用Django现有的django.contrib.auth.admin.UserAdmin类。" - wsvincent
谢谢。我会进一步研究它,因为它使用了 AbstractBaseUser 完成了整个流程。看起来使用 AbstractUser 不需要太多的代码,但也许情况并非如此。 - wsvincent
是的,我认为问题出在表单上。我已经添加了views.py。我认为问题在于表单,但仍然困惑。 - wsvincent
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接