django中的自定义用户模型

Arc*_*rma 14 python django model-view-controller django-models

我想使用django.contrib.auth.models.AbstractUserdjangodocs中所述创建自定义用户模型:

如果您对Django的用户模型完全满意并且您只想添加一些其他配置文件信息,则可以简单地继承django.contrib.auth.models.AbstractUser并添加自定义配置文件字段.此类提供默认用户的完整实现作为抽象模型.

所以我在AbstractUser班上继承了这个班,Users并添加了一个字段.但是当我运行时,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.
Run Code Online (Sandbox Code Playgroud)

我在stackoverflow上经历了其他问题,但无法解决错误.这是我的代码:

models.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)
Run Code Online (Sandbox Code Playgroud)

admin.py

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)
Run Code Online (Sandbox Code Playgroud)

settings.py

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'
Run Code Online (Sandbox Code Playgroud)

编辑:

我想将用户信息存储在同一个表中,auth_user而不是存储在新表中.

Nil*_*Nil 9

我在我的一个项目中做到了这一点.我很惊讶地看到你扩展了User因为doc说了别的东西 :)你可以扩展Django User模型,但是如果你只想添加新字段(不改变它的行为),你应该使用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.
Run Code Online (Sandbox Code Playgroud)

因此,正如您在链接中看到的,您的代码应如下所示:

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 = ...
Run Code Online (Sandbox Code Playgroud)