Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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_Database_Django Models_Django Users - Fatal编程技术网

Python 自定义Django用户模型-用户名作为主键属性

Python 自定义Django用户模型-用户名作为主键属性,python,django,database,django-models,django-users,Python,Django,Database,Django Models,Django Users,如何在Django中创建自己的用户模型,其中我希望我的p.K是用户名字段,而不是Django自动生成的id字段 我正在尝试以下方法: from __future__ import unicode_literals from django.db import models from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin # Create your models here.

如何在Django中创建自己的用户模型,其中我希望我的p.K是用户名字段,而不是Django自动生成的id字段

我正在尝试以下方法:

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin

# Create your models here.
class User(AbstractBaseUser, PermissionsMixin):

GENDER_MALE = 'M'
GENDER_FEMALE = 'F'
GENDER_OTHER = 'O'
GENDER_CHOICES = (
    (GENDER_MALE, u'Male'),
    (GENDER_FEMALE, u'Female'),
)

username = models.CharField(max_length=15, unique=True, db_index=True, primary_key=True)

first_name=models.CharField(max_length=50, blank=False,)
last_name=models.CharField(max_length=50, blank=False,)
photo = models.ImageField(upload_to='avatars', blank=True)
email = models.EmailField(max_length=254, unique=True)
is_staff = models.BooleanField(
    default=True,
    help_text='Designates whether the user can log into this admin site.')
is_active = models.BooleanField(default=True)
#date_joined = models.DateTimeField(default=None)
#date_joined = models.DateTimeField()

gender = models.CharField(
    max_length=1,
    choices=GENDER_CHOICES,
    blank=False, )

is_player = models.BooleanField(default=False)
is_coach = models.BooleanField(default=False)
is_viewer = models.BooleanField(default=False)

USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email',]
objects = UserManager()

class Meta:
    db_table = 'auth_user'

def get_full_name(self):
    """
    Returns the first_name plus the last_name, with a space in between.
    """
    full_name = '%s %s' % (self.first_name, self.last_name)
    return full_name.strip()

def get_short_name(self):
    "Returns the short name for the user."
    return self.first_name
我已经创建了userprofiles应用程序,我将在其中创建自定义django用户模型

INSTALLED_APPS = [
       ...
    'userprofiles.apps.UserprofilesConfig',
       ...
]

AUTH_USER_MODEL = 'userprofiles.User'
在我的
userprofiles/models.py
文件中,我定义了以下内容:

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin

# Create your models here.
class User(AbstractBaseUser, PermissionsMixin):

GENDER_MALE = 'M'
GENDER_FEMALE = 'F'
GENDER_OTHER = 'O'
GENDER_CHOICES = (
    (GENDER_MALE, u'Male'),
    (GENDER_FEMALE, u'Female'),
)

username = models.CharField(max_length=15, unique=True, db_index=True, primary_key=True)

first_name=models.CharField(max_length=50, blank=False,)
last_name=models.CharField(max_length=50, blank=False,)
photo = models.ImageField(upload_to='avatars', blank=True)
email = models.EmailField(max_length=254, unique=True)
is_staff = models.BooleanField(
    default=True,
    help_text='Designates whether the user can log into this admin site.')
is_active = models.BooleanField(default=True)
#date_joined = models.DateTimeField(default=None)
#date_joined = models.DateTimeField()

gender = models.CharField(
    max_length=1,
    choices=GENDER_CHOICES,
    blank=False, )

is_player = models.BooleanField(default=False)
is_coach = models.BooleanField(default=False)
is_viewer = models.BooleanField(default=False)

USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email',]
objects = UserManager()

class Meta:
    db_table = 'auth_user'

def get_full_name(self):
    """
    Returns the first_name plus the last_name, with a space in between.
    """
    full_name = '%s %s' % (self.first_name, self.last_name)
    return full_name.strip()

def get_short_name(self):
    "Returns the short name for the user."
    return self.first_name
我使用的原因是:

AbstractBaseUser提供用户模型的核心实现, 包括哈希密码和令牌化密码重置。你必须 然后提供一些关键的实现细节:

也就是说,有必要手动添加我需要的字段

然后,当我执行迁移时,我在
用户
模型中定义的字段(从
AbstractBaseUser
继承)将在我的数据库中创建:

(fuupbol) ➜  fuupbol_project git:(master) ✗ python manage.py makemigrations
    Migrations for 'userprofiles':
    0013_auto_20160418_2252.py:
    - Add field groups to user
    - Add field user_permissions to user
    - Alter field is_superuser on user
    (fuupbol) ➜  fuupbol_project git:(master) ✗ python manage.py migrate
    Operations to perform:
    Apply all migrations: sessions, userprofiles, admin, contenttypes, auth
    Running migrations:
    Rendering model states... DONE
     Applying userprofiles.0013_auto_20160418_2252... OK
    (fuupbol) ➜  fuupbol_project git:(master) ✗

然后我通过命令行界面以这种方式创建了一个超级用户:

(fuupbol) ➜  fuupbol_project git:(master) ✗ python manage.py createsuperuser
Username: cdiaz   
Email: cdiaz@fuupbol.org
Password: 
Password (again): 
Superuser created successfully.
(fuupbol) ➜  fuupbol_project git:(master) ✗ 
  • 此外,我还为Django管理员可以查看的自定义用户模型添加了以下字段:
像Django一样,使用特殊的表单在管理相对用户模型中创建和编辑表单,因为这些表单只被认为是Django原始用户模型的表单

在这里,我们使用带有
AbstractBaseUser
的自定义django用户模型,然后使用以下类:

  • 应用于用户模型的
    UserChangeForm
    ,因此这种方式应用于管理员用户表单,并使用先前修改定制的“我的用户表单”创建用户的
    UserCreationForm
在我的
userprofiles/forms.py
文件中

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

from .models import User

class CustomUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = User

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = User
在我的
userprofiles/admin.py
文件中,创建一个CustomUserAdmin类,该类使用之前在自定义用户模型中定义的字段进行自定义

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

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

# Register your models here.                                                                                                                                                           

class CustomUserAdmin(UserAdmin):                                                                                                                                                      
    form = CustomUserChangeForm                                                                                                                                                        
    add_form = CustomUserCreationForm                                                                                                                                                  
    fieldsets = UserAdmin.fieldsets + (                                                                                                                                                
        (                                                                                                                                                                              
            None, {                                                                                                                                                                    
                'fields':(                                                                                                                                                             
                    'username',                                                   
                    'password',                                                                                                                                                        
                    'first_name',                                                                                                                                                      
                    'last_name',                                                                                                                                                       
                    'gender',                                                                                                                                                          
                    'email',                                                                                                                                                           
                    'photo',                                                                                                                                                           
                    'is_staff',                                                                                                                                                        
                    'is_active',                                                                                                                                                       
                    'is_superuser',                                                                                                                                                    
                    'is_player',                                                                                                                                                       
                    'is_coach',                                                                                                                                                        
                    'is_viewer',                                                                                                                                                       
                    'last_login',                                                                                                                                                                                                                                                                                                                           
                )                                                                                                                                                                      
            }                                                                                                                                                                          
        ),                                                                                                                                                                             
    )                                                                                                                                                                                  


#Change our UserAdmin class to inherit of our CustomUserAdmin created above (do not inherit of model.ModelAdmin)                                                                       
@admin.register(User)                                                                                                                                                                  
class UserAdmin(CustomUserAdmin):                                                                                                                                                                                            
    list_display = ('username','password','first_name','last_name','gender','email','photo','is_staff','is_active','is_superuser','is_player','is_coach','is_viewer','last_login',)  
然后,当我转到Django管理员并看到编辑已创建用户的选项时,我会收到以下消息:

此时,我的用户模型中没有
date\u joined
属性,如果我将
date\u joined
属性添加到我的用户模型并执行迁移,我会收到以下消息:

(fuupbol) ➜  fuupbol_project git:(master) ✗ python manage.py makemigrations userprofiles
Migrations for 'userprofiles':
  0022_user_date_joined.py:
    - Add field date_joined to user
(fuupbol) ➜  fuupbol_project git:(master) ✗ 
当我执行
migrate
命令时

(fuupbol) ➜  fuupbol_project git:(master) ✗ python manage.py migrate userprofiles       
    Operations to perform:
      Apply all migrations: userprofiles
    Running migrations:
      Rendering model states... DONE
      Applying userprofiles.0015_user_date_joined...Traceback (most recent call last):
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
    psycopg2.IntegrityError: column "date_joined" contains null values


    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
        utility.execute()
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/core/management/__init__.py", line 345, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute
        output = self.handle(*args, **options)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 200, in handle
        executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/migrations/executor.py", line 92, in migrate
        self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
        state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
        state = migration.apply(state, schema_editor)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/migrations/migration.py", line 123, in apply
        operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 62, in database_forwards
        field,
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 396, in add_field
        self.execute(sql, params)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 110, in execute
        cursor.execute(sql, params)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/backends/utils.py", line 79, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/utils.py", line 95, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
    django.db.utils.IntegrityError: column "date_joined" contains null values

    (fuupbol) ➜  fuupbol_project git:(master) ✗ 
(fuupbol)➜  fuupbol_项目git:(硕士)✗ python manage.py迁移用户配置文件
要执行的操作:
应用所有迁移:userprofiles
运行迁移:
正在渲染模型状态。。。完成
正在应用userprofiles.0015\u用户\u加入日期\u…回溯(最近一次通话):
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/backends/utils.py”,第64行,执行
返回self.cursor.execute(sql,params)
psycopg2.IntegrityError:列“加入日期”包含空值
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“manage.py”,第10行,在
从命令行(sys.argv)执行命令
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/core/management/_init__.py”,第353行,从命令行执行
utility.execute()
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/core/management/_init__.py”,执行中第345行
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-packages/django/core/management/base.py”,第348行,运行时来自
self.execute(*args,**cmd_选项)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/core/management/base.py”,第399行,在execute中
输出=self.handle(*args,**选项)
handle中的文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/core/management/commands/migrate.py”,第200行
executor.migrate(目标、计划、假=假、假首字母=假首字母)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/migrations/executor.py”,第92行,在migrate中
self.\u迁移\u所有\u转发(计划、完整计划、假=假、假首字母=假首字母)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/migrations/executor.py”,第121行,全部向前迁移
state=self.apply\u迁移(state,migration,false=false,false\u initial=false\u initial)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/migrations/executor.py”,第198行,在应用程序迁移中
state=migration.apply(状态,模式编辑器)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/migrations/migration.py”,第123行,在apply中
操作。数据库转发(self.app\u标签、模式编辑器、旧状态、项目状态)
数据库中的文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/migrations/operations/fields.py”,第62行
领域
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/backends/base/schema.py”,第396行,在add_字段中
self.execute(sql,params)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/backends/base/schema.py”,第110行,在execute中
cursor.execute(sql,params)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/backends/utils.py”,执行中第79行
返回super(CursorDebugWrapper,self).execute(sql,params)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/backends/utils.py”,第64行,执行
返回self.cursor.execute(sql,params)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site packages/django/db/utils.py”,第95行,在退出时__
6.重新播放(dj_exc_类型、dj_exc_值、回溯)
文件“/home/bgarcial/.virtualenvs/fuupbol/lib/python3.4/site-