Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django中的自定义用户模型_Python_Django_Model View Controller_Django Models - Fatal编程技术网

Python django中的自定义用户模型

Python django中的自定义用户模型,python,django,model-view-controller,django-models,Python,Django,Model View Controller,Django Models,我想使用django.contrib.auth.models.AbstractUser创建一个自定义用户模型,如djangodocs中所述: 如果您对Django的用户模型非常满意,并且只想 添加一些额外的概要信息,您可以简单地将 django.contrib.auth.models.AbstractUser并添加自定义配置文件 领域。此类提供了缺省值的完整实现 用户作为抽象模型 因此,我在Users类中继承了AbstractUser类,并添加了一个字段。但是当我运行python manage.

我想使用django.contrib.auth.models.AbstractUser创建一个自定义用户模型,如djangodocs中所述:

如果您对Django的用户模型非常满意,并且只想 添加一些额外的概要信息,您可以简单地将 django.contrib.auth.models.AbstractUser并添加自定义配置文件 领域。此类提供了缺省值的完整实现 用户作为抽象模型

因此,我在
Users
类中继承了
AbstractUser
类,并添加了一个字段。但是当我运行
python manage.py syncdb
时,我得到以下错误:

CommandError: One or more models did not validate:
admin.logentry: 'user' has a relation with model login.users, which has either 
not been installed or is abstract.
我查看了有关stackoverflow的其他问题,但无法解决该错误。这是我的密码:

型号.py

from django.conf import settings
from django.db import models
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import AbstractUser
from django.contrib import admin

class Users(AbstractUser):
    college = models.CharField(max_length=40)

admin.site.register(Users, UserAdmin)
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from login.models import Users
from django import forms

class UsersChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = Users

class UsersAdmin(UserAdmin):
    form = UsersChangeForm

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('college',)}),
    )


admin.site.register(Users, UsersAdmin)
INSTALLED_APPS = (
    'forms',
    'login',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

AUTH_USER_MODEL = 'login.users'
admin.py

from django.conf import settings
from django.db import models
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import AbstractUser
from django.contrib import admin

class Users(AbstractUser):
    college = models.CharField(max_length=40)

admin.site.register(Users, UserAdmin)
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from login.models import Users
from django import forms

class UsersChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = Users

class UsersAdmin(UserAdmin):
    form = UsersChangeForm

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('college',)}),
    )


admin.site.register(Users, UsersAdmin)
INSTALLED_APPS = (
    'forms',
    'login',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

AUTH_USER_MODEL = 'login.users'
设置.py

from django.conf import settings
from django.db import models
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import AbstractUser
from django.contrib import admin

class Users(AbstractUser):
    college = models.CharField(max_length=40)

admin.site.register(Users, UserAdmin)
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from login.models import Users
from django import forms

class UsersChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = Users

class UsersAdmin(UserAdmin):
    form = UsersChangeForm

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('college',)}),
    )


admin.site.register(Users, UsersAdmin)
INSTALLED_APPS = (
    'forms',
    'login',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

AUTH_USER_MODEL = 'login.users'
编辑:


我想将用户信息存储在与
auth_user
相同的表中,而不是存储在新表中。

我在我的一个项目中这样做了。我很惊讶地看到您扩展了用户,因为:)您可以扩展Django用户模型,但如果您只想添加新字段(而不是更改其行为),则应该使用OneToOneField

If you wish to store information related to User, you can use a one-to-one
relationship to a model containing the fields for additional information.
因此,正如您在链接中看到的,您的代码应该如下所示:

from django.contrib.auth.models import User

class MyUser(models.Model):
    user = models.OneToOneField(User)

    # Or a ForeingKey to the College table?
    college = models.CharField(max_length=40)

    other_data = ...

尝试在models.py中删除此行:

admin.site.register(用户,UserAdmin

我发现了你的错误,你安装的应用程序顺序错误,它们应该是下一个:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.sites',
    #'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'login',
    'forms',
)

AUTH_USER_MODEL = "login.User"
为什么?

查看管理员使用的是用户模型,因此您可能会想:

但是我的用户模型是进入
应用程序,而这一个是在admin应用程序之前,因此
是在admin之前安装的,为什么它不起作用?。这是因为django.contrib.auth是可交换的(在您的情况下,可以通过login.User替换另一个模型),因此当您创建新的用户模型时,django必须将其用户模型更改为新模型,然后您必须安装其余模型

How must be at the moment of run syncdb:


1.- django.contrib.auth is installed, then this see if has been swapped, if yes it adds the new field or override completely the User Model (in your case only you add a field).

2.- admin, contentypes.... your apps, are installed and all works.

How you had it:

1.- login is installed (where the new User Model was, you put the AUTH_USER_MODEL in settings)

2.- Then forms.

3.- Then django tries to install the admin app but it can't because auth_user table hasn't been added that's because django.contrib.auth was after admin, therefore there is no User Model, this one isnt's swapped and this throws the error  **admin.logentry: 'user' has a relation with model login.users, which has either 
not been installed or is abstract.**

因此,首先您必须安装
django.contrib.auth
应用程序,然后安装依赖于的所有应用程序。

最好使用get\u user\u model()(获取项目中活动的用户模型。在django.contrib.auth中定义)和auth\u user\u model(引用用户模型)来保持代码的通用性而不是直接参考用户模型

from django.conf import settings

class MyUser(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)

    # Or a ForeingKey to the College table?
    college = models.CharField(max_length=40)

    other_data = ...

实际上,我想将它们存储在与Django 1.5中的
auth_user
相同的表中,您不需要额外的表来扩展用户表。@Nil,您能检查一下这个问题吗?:)我试过了,但没用,我收到了同样的错误消息你是如何订购安装的应用程序的?是的,我订购的方式与你提到的相同。你在表单应用程序中是否有用户的外键?@Victor,我使用
AbstractUser
扩展了默认用户表。管理员运行平稳,但当我在单击“保存”后尝试添加新用户时,我收到一个错误
ORA-00942:表或视图不存在
,但我的Oracle db中有一个表,我的Model.py上有一个表。这是命名联盟吗?除了
类用户(AbstractUser)之外,您是否可以尝试其他模型名称:
@Charlesliam在将名称从
User
更改为
MyUser
并运行
python manage.py syncdb
后,我收到一个新错误
1146,Table stapper.login\u myuser\u user\u权限不存在django
与用户相关的权限的新表应为\u user\u权限。从你的陈述中我相信了。您的应用程序名是
login
,您的型号名是
myuser
。您可以尝试手动将表添加到数据库中。