拓展 User 模型

Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息。对于 Django 内置的 User 模型, 仅包含以下一些主要的属性:

  • username,即用户名
  • password,密码
  • email,邮箱
  • first_name,名
  • last_name,姓

对于一些网站来说,用户可能还包含有昵称、头像、个性签名等等其它属性,因此仅仅使用 Django 内置的 User 模型是不够。好在 Django 用户系统遵循可拓展的设计原则,我们可以方便地拓展 User 模型。

继承 AbstractUser 拓展用户模型

这是推荐做法。事实上,查看 User 模型的源码就知道,User 也是继承自 AbstractUser 抽象基类,而且仅仅就是继承了 AbstractUser,没有对 AbstractUser 做任何的拓展。以下就是 User 的源码:

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username, password and email are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

所以,如果我们继承 AbstractUser,将获得 User 的全部特性,而且还可以根据自己的需求进行拓展。

我们之前新建了一个 users 应用,通常我们把和数据库模型相关的代码写在 models.py 文件里。打开 users/models.py 文件,写上我们自定义的用户模型代码:

users/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    nickname = models.CharField(max_length=50, blank=True)

    class Meta(AbstractUser.Meta):
        pass

我们给自定义的用户模型新增了一个 nickname(昵称)属性,用来记录用户的昵称信息,设置 blank=True 的目的是让用户在注册时无需填写昵称。根据你的需求可以自己进一步拓展,例如增加用户头像、个性签名等等,添加多少属性字段没有任何限制。

同时,我们继承了 AbstractUser 的内部类属性 Meta ,不过目前什么也没做。在这里继承 Meta 的原因是在你的项目中可能需要设置一些 Meta 类的属性值,不要忘记继承 AbstractUser.Meta 中已有的属性。

注意:一定要继承 AbstractUser,而不是继承 auth.User。尽管 auth.User 继承自 AbstractUser 且并没有对其进行任何额外拓展,但 AbstractUser 是一个抽象类,而 auth.User 不是。如果你继承了 auth.User 类,这会变成多表继承,在目前的情况下这种继承方式是不被推荐的。关于 Django 的抽象模型类和多表继承,请查阅 Django 的官方文档 模型继承

此外,AbstractUser 类又继承自 AbstractBaseUser,前者在后者的基础上拓展了一套用户权限(Permission)系统。因此如非特殊需要,尽量不要从 AbstractBaseUser 拓展,否则你需要做更多的额外工作。

为了让 Django 用户认证系统使用我们自定义的用户模型,必须在 settings.py 里通过 AUTH_USER_MODEL 指定自定义用户模型所在的位置,即需要如下设置:

django_auth_example/settings.py

# 其它设置...
AUTH_USER_MODEL = 'users.User'

即告诉 Django,使用 users 应用下的 User 用户模型。

顺便再修改一下语言设置和时区设置:

django_auth_example/settings.py

# 其它设置...

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

设置好自定义用户模型后,生成数据库迁移文件,并且迁移数据库以生成各个应用必要的数据库表。即运行如下两条命令:

$ python manage.py makemigrations
$ python manage.py migrate

OK,现在 Django 用户系统使用的用户模型就是自定义的 User 模型了。

注意:一定要在设置好 AUTH_USER_MODEL = 'users.User' 后在第一次迁移数据库,即指定好自定义的用户模型后再执行数据库迁移命令。

使用 Profile 模式拓展用户模型

如果想为一个已使用了 Django 内置 User 模型的项目拓展用户模型,上述继承 AbstractUser 的拓展方式会变得有点麻烦。Django 没有提供一套自动化的方式将内置的 User 迁移到自定义的用户模型,因为 Django 已经为内置的 User 模型生成了相关数据库迁移文件和数据库表。如果非要这么做的话,需要手工修改迁移文件和数据库表,并且移动数据库中相关的用户数据。

所以我们采用另一种不改动数据库表的方式来拓展用户模型,具体来说,我们在创建一个模型(通常命名为 Profile)来记录用户相关的数据,然后使用一对一的方式将这个 Profile 模型和 User 关联起来,就好像每个用户都关联着一张记录个人资料的表一样。代码如下:

models.py

from django.contrib.auth.models import User

class Profile(models.Model):
    nickname = models.CharField(max_length=50, blank=True)
    user = models.OneToOneField(User)

这种方式和 AbstractUser 的区别是,继承 AbstractUser 的用户模型只有一张数据库表。而 Profile 这种模式有两张表,一张是 User 模型对应的表,一张是 Profile 模型对应的表,两张表通过一对一的关系关联。可见,当要查询某个用户的 Profile 时,需要执行额外的跨表查询操作,所以这种方式比起直接继承 AbstractUser 效率更低一点。因此对于新项目来说,优先推荐使用继承 AbstractUser 的方式来拓展用户模型。

PS:如果你使用了Profile 模式,你可能希望在创建 User 对象的时候同时也创建与之关联的 Profile 对象。你可以使用 Django 的 Signal 实现这个需求。由于 Profile 模式不是我们要介绍的重点内容,因此具体的实现细节请参照相关的文档,这里不再赘述。

OK,自定义的 User 模型已经建立好了,接下来就是如何创建用户,即用户注册流程了。

总结

本教程的示例项目代码位于 GitHub:Django Auth Example

如果遇到问题,请通过下面的方式寻求帮助。

  • 在下方评论区留言。
  • 将问题的详细描述通过邮件发送到 djangostudyteam@163.com,一般会在 24 小时内回复。
  • Pythonzhcn 社区的新手问答版块 发布帖子。

更多 Django 相关教程,请访问我的个人博客:追梦人物的博客

-- EOF --


63 条评论 / 21 人参与
碉你妹的堡

  File "C:\Users\Liukai\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\auth\checks.py",line 29, in check_user_model    if not isinstance(cls.REQUIRED_FIELDS, (list, tuple)):AttributeError: type object 'Employee' has no attribute 'REQUIRED_FIELDS'


这个报错 怎么解决呢????


碉你妹的堡 碉你妹的堡

知道问题了 


huyang233

我的问题可能有些复杂,我想让之前博客的评论功能中评论用户的名字不是自定义,而是登录用户才能评论。于是我将评论表单中名字,邮箱,URL字段都删除了,只留下像这样:

fields = ['text']

然后我再comments的models中将name字段设置成了外键,我是这样设置的,感觉问题是出在这一步:

name = models.ForeignKey('users.User',on_delete=models.CASCADE)

最后我在detail模板中的模板变量未做改变(我觉得好像不用变),依然是:

<span class="nickname">{{ comment.name }}</span>

但在提交评论是有一个NOT NULL constraint failed: comments_comment.name_id的错误,看字面是说这个name字段为空,就是没get到当前登录用户的名字,这是为什么?该怎么做?


huyang233 huyang233

成功了,在comments.views.py中为name字段赋值即可

c = Comment(name=request.user,text=comment,article=article)

c.save()


jizhongwei

博主您好!为什么我用注册页面的用户名去登录老显示错误啊Image


追梦人物 [博主] jizhongwei

图片看不到了!是什么错误?


用户2381497447

博主你好,感谢您昨天的解答。我已经解决了。但是今天我尝试在另一个项目中加入登录系统出现许多的错误(使用的是您另一个blog搭建教程实例),因为之前已经在models中注册了数据库,使用的是MySQL,已经成功。现在想加入注册、登录、注销等功能,但是我卡在models里面了。报错:

blog.Post.author: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.

我在setting里面已将加入AUTH_USER_MODEL = 'blog.User'。也注册了app,也尝试下面朋友报错您给出的方案:

所有通过 foreinkey 关联 user 的都要使用 settings.AUTH_USER_MODEL

例如:class Post(models.model):author = models.ForeignKey(settings.AUTH_USER_MODEL)

但是我使用了也不行,会报错。也尝试了from django.conf import settings,但根本没用。请问博主,这个问题该怎样解决?我还等着部署在服务器呢!


用户2381497447 用户2381497447

麻烦好心的博主大大,帮忙解答下呗。万分感谢!


追梦人物 [博主] 用户2381497447

如果你以前关联了 auth.User,那改为自定义 User 后需要删掉数据库重新生成。


用户2381497447 追梦人物 [博主]

请问博主,怎样操作呢?


追梦人物 [博主] 用户2381497447

修改代码后删掉数据库和 migratons/ 文件下的全部文件,然后重新运行迁移数据库的两条命令即可。


用户2381497447

博主,您好。我是按照您这个方式做的。但是得到如下错误,是怎么回事呢?

Traceback (most recent call last):  File "manage.py", line 22, in <module>    execute_from_command_line(sys.argv)  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\core\management\__init__.py", line 364, in execute_from_command_line    utility.execute()  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\core\management\__init__.py", line 338, in execute    django.setup()  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\__init__.py", line 27, in setup    apps.populate(settings.INSTALLED_APPS)  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\apps\registry.py", line 116, in populate    app_config.ready()  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\contrib\admin\apps.py", line 23, in ready    self.module.autodiscover()  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\contrib\admin\__init__.py", line 26, in autodiscover    autodiscover_modules('admin', register_to=site)  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\utils\module_loading.py", line 50, in autodiscover_modules    import_module('%s.%s' % (app_config.name, module_to_search))  File "E:\ruanjian\py\lib\importlib\__init__.py", line 126, in import_module    return _bootstrap._gcd_import(name[level:], package, level)  File "<frozen importlib._bootstrap>", line 986, in _gcd_import  File "<frozen importlib._bootstrap>", line 969, in _find_and_load  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked  File "<frozen importlib._bootstrap_external>", line 665, in exec_module  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\contrib\auth\admin.py", line 7, in <module>    from django.contrib.auth.forms import (  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\contrib\auth\forms.py", line 22, in <module>    UserModel = get_user_model()  File "E:\ruanjian\py\lib\site-packages\django-1.11.8-py3.5.egg\django\contrib\auth\__init__.py", line 198, in get_user_model    "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODELdjango.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'users.User' that has not been installed


追梦人物 [博主] 用户2381497447

user 没有加入 INSTALLED_APPS 中,注意看报错信息的提示。


吉超

博主您好,请问执行makemigrations出现以下错误怎么回事呢,我settings里面也加了AUTH_USER_MODEL的

manage.py@blog_project > makemigrations "D:\软件目录\PyCharm 2017.2.3\bin\runnerw.exe" C:\Users\niejc\Envs\zmrc_blog_env\Scripts\python.exe "D:\软件目录\PyCharm 2017.2.3\helpers\pycharm\django_manage.py" makemigrations E:/items/blog_projectSystemCheckError: System check identified some issues:ERRORS:blog.Post.author: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out. HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.


追梦人物 [博主] 吉超

HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'. 将所有指向 User 的关系改为 settings.AUTH_USER_MODEL


naroul

博主您好,想请问一下,我用的是MySql数据库,按照上面设置完之后,运行manage.py报了一个错误:Error fetching command 'createsuperuser': AUTH_USER_MODEL refers to model 'users.User' that has not been installed .

Command 'createsuperuser' skipped

这个是因为没用django自带的数据库导致的吗?(AUTH_USER_MODEL = 'users.User' 在settings.py中配置好了)


naroul naroul

我弱智了。。忘记填写APP了


五寸

博主你好,我想请问下如果用Profile拓展了用户模型,要如何应用profile里面的数据?

我的models.py

from django.db import models

 from django.contrib.auth.models import AbstractUser

class User(AbstractUser): 

nickname = models.CharField(max_length=50, blank=True) 

      class Meta(AbstractUser.Meta): pass

class MyUser(models.Model): 

      user = models.OneToOneField(User)

      phone = models.CharField(max_length=20, null=True, blank=True) 

      avatar = models.ImageField(upload_to='photo', null=True, blank=True)

我已经用admin账号在后台填写了phone的值了。

但是我在test.html里写{{user.username}}可以显示出来账号名字

写{{Myuser.phone}}却显示不出来电话,请问需要怎么做才能让前台显示出后台的数据呢?

刚刚开始学,如果问了蠢问题请见谅


追梦人物 [博主] 五寸

你如果 user 是 User 的实例,应该这样:user.myuser.phone。否则你需要使用 MyUser 的实例直接获取{{myuser.phone}},属性属于哪个类,就要使用哪个类的实例,user.myuser 可以获得 user 关联的 MyUser 实例。


JeanChrist

博主你好,我有遇到一个问题,我想要在视图函数中调用User中自带的属性,比如(username)。不知道应该怎么做,望告知。


追梦人物 [博主] JeanChrist

对 User 是实例引用username即可,例如 user.username(假设你的 user 为你创建的 User实例)


tianshanghong

您好,在拓展用户模型的时候解决中文翻译问题?比如说:

我添加了一个叫做mobile_phone_number的域来存储用户的手机号码。但是在渲染成注册界面的表单时,显示为“Mobiel phone number”。请教博主有没有方法可以将其显示为中文的“手机号码”?

提前谢谢您啦~


追梦人物 [博主] tianshanghong

在 mobile_phone_number Field 里设置参数 verbose_name = ‘手机号’


tianshanghong 追梦人物 [博主]

按照您说的方法已经解决了。非常感谢博主!


小林子哈2014

博主我在你之前的django博客教程中按照你的注册教程加了user app 然后报错了:

auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'UserProfile.groups'.HINT: Add or change a related_name argument to the definition for 'User.groups' or'UserProfile.groups'.auth.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' clashes with reverse accessor for 'UserProfile.user_permissions'.HINT: Add or change a related_name argument to the definition for 'User.user_permissions' or'UserProfile.user_permissions'.

这能解决吗


追梦人物 [博主] 小林子哈2014

把异常信息翻译成中文就可以得到解决方案。


密西密西57545

博主,我出现了这个问题,请问该如何解决?


Operations to perform:  Apply all migrations: admin, auth, contenttypes, polls, sessionsTraceback (most recent call last):  File "manage.py", line 22, in <module>    execute_from_command_line(sys.argv)  File "D:\python3.6.2\lib\site-packages\django\core\management\__init__.py", line 364, in execute_from_command_line    utility.execute()  File "D:\python3.6.2\lib\site-packages\django\core\management\__init__.py", line 356, in execute    self.fetch_command(subcommand).run_from_argv(self.argv)  File "D:\python3.6.2\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv    self.execute(*args, **cmd_options)  File "D:\python3.6.2\lib\site-packages\django\core\management\base.py", line 330, in execute    output = self.handle(*args, **options)  File "D:\python3.6.2\lib\site-packages\django\core\management\commands\migrate.py", line 164, in handle    pre_migrate_apps = pre_migrate_state.apps  File "D:\python3.6.2\lib\site-packages\django\utils\functional.py", line 35, in __get__    res = instance.__dict__[self.name] = self.func(instance)  File "D:\python3.6.2\lib\site-packages\django\db\migrations\state.py", line 218, in apps    return StateApps(self.real_apps, self.models)  File "D:\python3.6.2\lib\site-packages\django\db\migrations\state.py", line 295, in __init__    raise ValueError("\n".join(error.msg for error in errors))ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'polls.user', but app 'polls' doesn't provide model 'user'.


皮皮欧呢

from blogproject.settings import AUTH_USER_MODEL

问题解决 


追梦人物 [博主] 皮皮欧呢

嗯,我好像在文中没有说明如何关联自定义 User 的问题,你的方法是对的,不过对于 settings 对象,最好从

from django.conf import settings

皮皮欧呢

博主,我遇到了和楼下的楼下  同一个问题,这是我的解决方案

from   blogproject import settings

…………

author = models.ForeignKey(settings.AUTH_USER_MODEL)

但是报错AttributeError: 'module' object has no attribute 'settings’

我导入的settings不对吗?那请问应该怎么弄?


ptrees1761038083
migrate的时候报错,希望能帮忙看下,谢谢!
>python manage.py migrate
Traceback (most recent call last):
File "manage.py", line 22, in
execute_from_command_line(sys.argv)
File "D:\Program Files\Python35\lib\site-packages\django\core\management\__init__.py", line 363, in exec
ute_from_command_line
utility.execute()
File "D:\Program Files\Python35\lib\site-packages\django\core\management\__init__.py", line 355, in exec
ute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "D:\Program Files\Python35\lib\site-packages\django\core\management\base.py", line 283, in run_from
_argv
self.execute(*args, **cmd_options)
File "D:\Program Files\Python35\lib\site-packages\django\core\management\base.py", line 330, in execute
output = self.handle(*args, **options)
File "D:\Program Files\Python35\lib\site-packages\django\core\management\commands\migrate.py", line 86,
in handle
executor.loader.check_consistent_history(connection)
File "D:\Program Files\Python35\lib\site-packages\django\db\migrations\loader.py", line 298, in check_co
nsistent_history
connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied befo
re its dependency myAuth.0001_initial on database 'default'.

ptrees1761038083 ptrees1761038083
莫名其妙地又弄好了.....

追梦人物 [博主] ptrees1761038083
偶然问题,重新做一次就好了。

kuaidanian
blog.Post.author: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.
HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
继承AbstractUser 在生成数据库时报了这个错

追梦人物 [博主] kuaidanian
HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'. 它提示你了。所有通过 foreinkey 关联 user 的都要使用 settings.AUTH_USER_MODEL

kuaidanian 追梦人物 [博主]
关键是我在setting里面配置了这个才报的这个错

追梦人物 [博主] kuaidanian
所有通过 foreinkey 关联 user 的都要使用 settings.AUTH_USER_MODEL

例如:
class Post(models.model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)

追梦人物 [博主] kuaidanian
详细信息可以参考:https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#referencing-the-user-model

kuaidanian 追梦人物 [博主]
好的,我去看看,谢谢博主

小糖豆和奇奇
试试

lllong33
ModuleNotFoundError: No module named 'user'
这个错误是因为没有自定义好吗?但是我的settings,models都检查了一遍没问题啊。

追梦人物 [博主] lllong33
应该是 user 路径问题,确保 user 符合 python package 规范,并且把 user 加入到 settings 的应用列表里。

lllong33 追梦人物 [博主]
users跟manage.py同一个目录,settings中也添加了AUTH_USER_MODEL='users.User',apps中也添加了,

lllong33 追梦人物 [博主]
解决了,urls中include(‘users.urls’)写成user.urls

fankers2017
楼主 前后台用户 您能给指导一下是怎么分离的吗

追梦人物 [博主] fankers2017
我还没实践过,不过方案应该很多,最好的就是用 django-rest-framework + 一个前端框架如 react.js/vue.js 等实现前后端分离。

reply-1988
博主你好,我的项目是用Pycharm生成的,里面的AUTH_USER_MODEL = 'users.User'这个是在global.settings里面的,修改时提醒这个文件不属于这个项目,我自己的理解是不能够修改。但是在项目的settings文件中又找不到AUTH_USER_MODEl配置,请问这种情况下该如何解决啊?谢谢。

追梦人物 [博主] reply-1988
在新生成的 django 项目下应该有一个 settings.py 文件吧,和 urls.py、wsgi.py 一个目录的,在这个文件里添加即可。

reply-1988 追梦人物 [博主]
好的,谢谢博主。

reply-1988 追梦人物 [博主]
博主,直接添加的话出现了一堆报错


Traceback (most recent call last):
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\auth\__init__.py", line 193, in get_user_model
return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\apps\registry.py", line 200, in get_model
app_config = self.get_app_config(app_label)
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\apps\registry.py", line 156, in get_app_config
raise LookupError(message)
LookupError: No installed app with label 'user'.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm 2017.1.4\helpers\pycharm\_jb_manage_tasks_provider.py", line 25, in
django.setup()
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\apps\registry.py", line 116, in populate
app_config.ready()
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\admin\apps.py", line 23, in ready
self.module.autodiscover()
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\admin\__init__.py", line 26, in autodiscover
autodiscover_modules('admin', register_to=site)
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\module_loading.py", line 50, in autodiscover_modules
import_module('%s.%s' % (app_config.name, module_to_search))
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 978, in _gcd_import
File "", line 961, in _find_and_load
File "", line 950, in _find_and_load_unlocked
File "", line 655, in _load_unlocked
File "", line 678, in exec_module
File "", line 205, in _call_with_frames_removed
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\auth\admin.py", line 7, in
from django.contrib.auth.forms import (
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\auth\forms.py", line 22, in
UserModel = get_user_model()
File "C:\Users\jingj\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\auth\__init__.py", line 198, in get_user_model
"AUTH_USER_MODEL refers to model '%s' that has n

reply-1988 追梦人物 [博主]
哦哦,好了,有个拼写错误。

追梦人物 [博主] reply-1988
看看你的目录结构以及相关的代码。

WhattTTEver
博主你好。想请问下,基本按照博主的教程敲得代码,在注册表单提交的时候,报错。没有users_user这张表,麻烦请问下是什么原因。谢谢。

追梦人物 [博主] WhattTTEver
需要运行 python manage.py makemigrations 和 migrate 创建数据库哈。

WhattTTEver 追梦人物 [博主]
运行了这两句,就是报错 no such table:users_user.

追梦人物 [博主] WhattTTEver
我怀疑你是否漏掉了一些步骤,例如配置 settings,详细内容见第一篇教程。

WhattTTEver 追梦人物 [博主]
就是创建数据库的时候,没反应,no changes.我在models添加删除都是 no changes

WhattTTEver 追梦人物 [博主]
现在解决了,谢谢博主的耐心解答。python manage.py makemigrations users
使用了这条语句就新建了 users_usrer表

_CindyL_
另外如果我有两种不同的用户类型有不同的属性,比方说学生和老师, 是应该用OneToOneField吗?如果AbstractUser的话好像有点复杂(先写一个继承AbstractUser的类,然后学生和老师分别前面那个类),而且这种写法好像也有点问题?谢谢。

_CindyL_ _CindyL_
学生和老师分别继承前面那个类

追梦人物 [博主] _CindyL_
这种场景比较推荐使用 profile 模式。

_CindyL_
请问一下博主,用AbstractUser方法的话,是否应该还要再定义一个user manager? 否则无法创建superuser?

追梦人物 [博主] _CindyL_
不用,这个类已经有了一个 manager,有 create user 和 superuser 的方法。