很多时候我们需要重写Django的User模型来满足我们的业务场景,那么废话不多说,咱们直接上代码,Copy可直接用的代码。
先来看下我的代码结构。按照此结构,创建对应的文件,写入内容即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | . ├── LICENSE ├── README.md ├── app │ ├── __init__.py │ ├── home │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── migrations │ │ ├── models.py │ │ ├── tests.py │ │ ├── urls.py │ │ ├── user │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ └── models.py │ │ └── views.py ├── dispatch │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── requirements.txt |
app/home/user/admin.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : YuLei Lan from django import forms from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.forms import ReadOnlyPasswordHashField from app.home.models import UserProfile class UserCreationForm(forms.ModelForm): """A form for creating new users. Includes all the required fields, plus a repeated password.""" password1 = forms.CharField(label='Password', widget=forms.PasswordInput) password2 = forms.CharField( label='Password confirmation', widget=forms.PasswordInput) class Meta: model = UserProfile fields = ('username', 'name') def clean_password2(self): # Check that the two password entries match password1 = self.cleaned_data.get("password1") password2 = self.cleaned_data.get("password2") if password1 and password2 and password1 != password2: raise forms.ValidationError("Passwords don't match") return password2 def save(self, commit=True): # Save the provided password in hashed format user = super(UserCreationForm, self).save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return user class UserChangeForm(forms.ModelForm): """A form for updating users. Includes all the fields on the user, but replaces the password field with admin's password hash display field. """ password = ReadOnlyPasswordHashField() class Meta: model = UserProfile fields = ('username', 'first_name', 'last_name', 'password', 'name', 'email', 'is_active', 'is_admin') def clean_password(self): # Regardless of what the user provides, return the initial value. # This is done here, rather than on the field, because the # field does not have access to the initial value return self.initial["password"] class UserAdmin(BaseUserAdmin): # The forms to add and change user instances form = UserChangeForm add_form = UserCreationForm # The fields to be used in displaying the User model. # These override the definitions on the base UserAdmin # that reference specific fields on auth.User. list_display = ('username', 'email', 'name', 'is_admin') list_filter = ('is_admin', ) fieldsets = ((None, { 'fields': ('username', 'password') }), (('Personal info'), { 'fields': ('first_name', 'last_name', 'email') }), (('Permissions'), { 'fields': ('is_active', ) })) # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin # overrides get_fieldsets to use this attribute when creating a user. add_fieldsets = ((None, { 'classes': ('wide', ), 'fields': ('username', 'name', 'password1', 'password2') }), ) search_fields = ('username', ) ordering = ('username', ) filter_horizontal = () |
app/home/user/models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : YuLei Lan from django.db import models from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser) class UserProfileManager(BaseUserManager): def create_user(self, password=None, **kwargs): """ Creates and saves a User with the given username, date of birth and password. """ if not kwargs: raise ValueError('Users must have an username address') # 开始创建账号 user = self.model(**kwargs) # 设置密码 user.set_password(password) user.save(using=self._db) return user # 创建管理员 def create_superuser(self, **kwargs): """ Creates and saves a superuser with the given username, date of birth and password. """ user = self.create_user(**kwargs) user.is_admin = True user.save(using=self._db) return user # 在这里设置你需要的字段 class UserProfile(AbstractBaseUser): username = models.CharField( verbose_name='username', max_length=128, unique=True, ) email = models.EmailField( verbose_name='email', max_length=255, null=True, blank=True, unique=True, ) first_name = models.CharField( verbose_name='名字', max_length=64, null=True, blank=True) last_name = models.CharField( verbose_name='姓', max_length=64, null=True, blank=True) name = models.CharField(max_length=128, null=True, blank=True) phone = models.CharField(max_length=128, null=True, blank=True) qq = models.CharField(max_length=128, null=True, blank=True) wechat = models.CharField(max_length=128, null=True, blank=True) sex = models.CharField(max_length=45, null=True, blank=True) is_active = models.BooleanField(verbose_name='是否可用', default=True) is_admin = models.BooleanField(verbose_name='是否管理员', default=False) create_date = models.DateTimeField( auto_now_add=True, blank=True, null=True) update_date = models.DateTimeField(blank=True, null=True, auto_now=True) objects = UserProfileManager() # 使用username作为必须的字段 USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['name', 'email'] def get_full_name(self): # The user is identified by their username address return self.username def get_short_name(self): # The user is identified by their username address return self.username def __unicode__(self): # __unicode__ on Python 2 return self.username def has_perm(self, perm, obj=None): """ Return True if the user has the specified permission. Query all available auth backends, but return immediately if any backend returns True. Thus, a user who has permission from a single auth backend is assumed to have permission in general. If an object is provided, check permissions for that object. """ # Active superusers have all permissions. if self.is_active and self.is_admin: return True def has_perms(self, perm, obj=None): "Does the user have a specific permission?" # Simplest possible answer: Yes, always return True def has_module_perms(self, app_label): "Does the user have permissions to view the app `app_label`?" # Simplest possible answer: Yes, always return True @property def is_staff(self): "Is the user a member of staff?" # Simplest possible answer: All admins are staff return self.is_admin class Meta: db_table = 'home_user_profile' verbose_name = '用户管理' verbose_name_plural = "用户管理" |
dispatch/settings.py
1 | AUTH_USER_MODEL = 'home.UserProfile' |
本文为原创文章,未经授权禁止转载本站文章。
原文出处:兰玉磊的个人博客
原文链接:https://www.fdevops.com/2021/03/17/django-28184
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。