拓展 User 模型

2017-05-1947156 阅读73 评论

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

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

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

-- EOF --

73 评论
登录后回复
lightlogic5
2020-02-13 14:32:06

第一个方法中,user表继承了AbstractUser
并且在类中填写了

class Meta(AbstractUser.Meta):
        pass

那系统自带的swappable = 'AUTH_USER_MODEL'这个属性继承了吗?
这个属性是做什么用的?

回复
Li Jinquan
2019-09-25 19:18:05

为什么注册的页面没有显示nikename?

回复
追梦人物 Li Jinquan
2019-09-26 12:33:07

注册表单并没有 nickname 字段

回复
Li Jinquan 追梦人物
2019-09-26 15:50:41

好的谢谢,我后来搞明白了,在fields那里。

回复
Leirss
2019-03-20 00:51:17

‘’‘OperationalError at /no such table: blog_postRequest Method:GETRequest URL:http://127.0.0.1:8000/Django Version:2.1.7Exception Type:OperationalErrorException Value:no such table: blog_postException Location:C:\LLL\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 298Python Executable:C:\LLL\Anaconda3\python.exePython Version:3.7.1Python Path:['C:\\LLL\\code\\django\\openlab', 'C:\\LLL\\Anaconda3\\python37.zip', 'C:\\LLL\\Anaconda3\\DLLs', 'C:\\LLL\\Anaconda3\\lib', 'C:\\LLL\\Anaconda3', 'C:\\LLL\\Anaconda3\\lib\\site-packages', 'C:\\LLL\\Anaconda3\\lib\\site-packages\\win32', 'C:\\LLL\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\LLL\\Anaconda3\\lib\\site-packages\\Pythonwin']

’‘’

博主你好 我是在前面的博客教程上注册了users

  然后我也尝试的删除了文件目录里的数据库等生成文件 

但是打开网站后报这个错

 求帮助一下啊

回复
匹诺曹200212
2019-01-02 12:43:33

为什么我从github上下载好源码后,点击注册或者登入,但是没又页面的跳转

回复
碉你妹的堡
2018-06-15 11:51:54

  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'


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

回复
碉你妹的堡 碉你妹的堡
2018-06-15 14:23:05

知道问题了 

回复
chunquansang 碉你妹的堡
2019-03-11 10:35:08

什么问题??

回复
huyang233
2018-05-01 16:57:08

我的问题可能有些复杂,我想让之前博客的评论功能中评论用户的名字不是自定义,而是登录用户才能评论。于是我将评论表单中名字,邮箱,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
2018-05-01 17:15:55

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

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

c.save()

回复
SamK6517433923 huyang233
2019-03-01 15:32:24

Unknown column 'comments_comment.name_id' in 'field list'  我这边提示,求解

回复
SamK6517433923 huyang233
2019-03-01 16:54:56

可以了在comments的models定义name为外键关键(comments和User)

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

注意上面外键,数据库comments表会生成name_id字段。


再修改forms.py的fields字段

fields = ['text']   #这里自己可以加email等其它,需要去掉name


最后修改comments的views视图函数

comment.name = request.user   #新增这条

comment.save()

完成以上即可。

回复
OMGkillerMao huyang233
2019-04-03 18:12:30

老哥,能加你QQ吗,我想知道你是怎么实现的。博主这个profile模式没讲详细

回复
jizhongwei
2018-03-28 11:38:55

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

回复
追梦人物 jizhongwei
2018-03-30 13:05:40

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

回复
用户2381497447
2018-01-12 10:56:43

博主你好,感谢您昨天的解答。我已经解决了。但是今天我尝试在另一个项目中加入登录系统出现许多的错误(使用的是您另一个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
2018-01-12 11:13:32

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

回复
追梦人物 用户2381497447
2018-01-13 12:12:07

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

回复
用户2381497447 追梦人物
2018-01-14 08:32:51

请问博主,怎样操作呢?

回复
追梦人物 用户2381497447
2018-01-15 13:49:32

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

回复
用户2381497447
2018-01-11 09:34:36

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

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
2018-01-11 11:43:31

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

回复
吉超
2018-01-06 16:05:21

博主您好,请问执行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'.

回复
追梦人物 吉超
2018-01-11 11:45:50

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

回复
naroul
2017-12-18 18:38:58

博主您好,想请问一下,我用的是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
2017-12-19 15:31:35

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

回复
五寸
2017-12-13 15:50:08

博主你好,我想请问下如果用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}}却显示不出来电话,请问需要怎么做才能让前台显示出后台的数据呢?

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

回复
追梦人物 五寸
2017-12-17 09:09:49

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

回复
JeanChrist
2017-11-10 15:33:21

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

回复
追梦人物 JeanChrist
2017-11-11 17:47:00

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

回复
tianshanghong
2017-10-28 18:29:33

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

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

提前谢谢您啦~

回复
追梦人物 tianshanghong
2017-10-29 16:04:55

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

回复
tianshanghong 追梦人物
2017-10-30 12:40:16

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

回复
小林子哈2014
2017-10-26 16:14:50

博主我在你之前的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
2017-10-27 18:01:26

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

回复
密西密西57545
2017-10-10 20:56:59

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


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

回复
皮皮欧呢
2017-09-04 21:04:08

from blogproject.settings import AUTH_USER_MODEL

问题解决 

回复
追梦人物 皮皮欧呢
2017-09-04 21:31:42

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

from django.conf import settings
回复
皮皮欧呢
2017-09-04 20:50:05

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

from   blogproject import settings

…………

author = models.ForeignKey(settings.AUTH_USER_MODEL)

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

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

回复
ptrees1761038083
2017-09-01 18:28:23

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
2017-09-01 18:41:18

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

回复
追梦人物 ptrees1761038083
2017-09-01 21:59:45

偶然问题,重新做一次就好了。

回复
kuaidanian
2017-08-17 14:23:25

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
2017-08-17 20:55:17

HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'. 它提示你了。所有通过 foreinkey 关联 user 的都要使用 settings.AUTH_USER_MODEL

回复
kuaidanian 追梦人物
2017-08-18 10:38:16

关键是我在setting里面配置了这个才报的这个错

回复
追梦人物 kuaidanian
2017-08-18 10:51:06

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

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

回复
追梦人物 kuaidanian
2017-08-18 10:52:33
回复
kuaidanian 追梦人物
2017-08-18 11:12:05

好的,我去看看,谢谢博主

回复
小糖豆和奇奇
2017-08-15 02:18:42

试试

回复
lllong33
2017-08-09 15:34:00

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

回复
追梦人物 lllong33
2017-08-10 10:31:38

应该是 user 路径问题,确保 user 符合 python package 规范,并且把 user 加入到 settings 的应用列表里。

回复
lllong33 追梦人物
2017-08-10 11:44:01

users跟manage.py同一个目录,settings中也添加了AUTH_USER_MODEL='users.User',apps中也添加了,

回复
lllong33 追梦人物
2017-08-10 12:02:46

解决了,urls中include(‘users.urls’)写成user.urls

回复
fankers2017
2017-08-09 02:07:58

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

回复
追梦人物 fankers2017
2017-08-10 10:34:21

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

回复
reply-1988
2017-08-04 18:12:47

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

回复
追梦人物 reply-1988
2017-08-04 20:57:47

在新生成的 django 项目下应该有一个 settings.py 文件吧,和 urls.py、wsgi.py 一个目录的,在这个文件里添加即可。

回复
reply-1988 追梦人物
2017-08-04 22:16:03

好的,谢谢博主。

回复
reply-1988 追梦人物
2017-08-04 22:31:02

博主,直接添加的话出现了一堆报错

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 追梦人物
2017-08-04 22:35:37

哦哦,好了,有个拼写错误。

回复
追梦人物 reply-1988
2017-08-05 18:38:29

看看你的目录结构以及相关的代码。

回复
WhattTTEver
2017-07-20 13:44:44

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

回复
追梦人物 WhattTTEver
2017-07-20 17:44:52

需要运行 python manage.py makemigrations 和 migrate 创建数据库哈。

回复
WhattTTEver 追梦人物
2017-07-20 19:48:28

运行了这两句,就是报错 no such table:users_user.

回复
追梦人物 WhattTTEver
2017-07-21 09:35:27

我怀疑你是否漏掉了一些步骤,例如配置 settings,详细内容见第一篇教程。

回复
WhattTTEver 追梦人物
2017-07-21 15:07:02

就是创建数据库的时候,没反应,no changes.我在models添加删除都是 no changes

回复
WhattTTEver 追梦人物
2017-07-21 15:13:07

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

回复
_CindyL_
2017-07-19 01:20:49

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

回复
_CindyL_ _CindyL_
2017-07-19 01:21:51

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

回复
追梦人物 _CindyL_
2017-07-19 12:35:07

这种场景比较推荐使用 profile 模式。

回复
_CindyL_
2017-07-19 00:51:18

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

回复
追梦人物 _CindyL_
2017-07-19 12:34:18

不用,这个类已经有了一个 manager,有 create user 和 superuser 的方法。

回复