在使用Django自带User模块时会遇到默认字段不够用的情况,在Django1.5以前可采用两种方式进行扩展:1、采用Profile的方式来扩展,即添加一个类似profile的模型和user模型关联,使用User做权限控制,Profile来存储用户相关信息。2、修改源代码,添加User Model字段。
Django1.5版本后开始支持自定义User模型。并且推荐使用此种方式。Django1.6后已经不再支持Profile方式。
Django1.6具体做法如下:
1、首先我新建一个project:customeuser。目录结构如下:
customuser ----customuser --------__init__.py --------settings.py --------usls.py --------wsgi.py ----manage.py
2、新增一个app:account。新的目录结构如下:
customuser ----account --------__init__.py --------admin.py --------models.py --------tests.py --------views.py ----customuser --------__init__.py --------settings.py --------usls.py --------wsgi.py ----manage.py
3、编写app:account下的models.py。内容如下:
# coding=utf-8 from django.db import models # Create your models here. from django.contrib.auth.models import BaseUserManager, AbstractBaseUser class MyDept(models.Model): name = models.CharField (u'部门',max_length=30) updept = models.ForeignKey("self",verbose_name='上级部门',related_name='MyDept_updept',null=True,blank=True) def __unicode__(self): return self.name class Meta: verbose_name = '部门' verbose_name_plural='部门' class MyUserManager(BaseUserManager): def create_user(self, email, username, password=None): if not email: raise ValueError('Users must have an email address') user = self.model( username = username, email=self.normalize_email(email), ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, username,password): user = self.create_user( email=self.normalize_email(email), username = username, password=password, ) user.is_admin = True user.save(using=self._db) return user class MyUser(AbstractBaseUser): username = models.CharField(u'用户名',max_length=40,unique=True) chinesename = models.CharField(u'中文名',max_length=40) email = models.EmailField( verbose_name='邮箱', max_length=255, unique=True, ) phone = models.CharField(u"电话",max_length=13,blank=True,null=True) dep = models.ForeignKey(MyDept,verbose_name=u'所属部门',related_name='MyUser_dep',null=True) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) objects = MyUserManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email'] class Meta: verbose_name = '用户' verbose_name_plural='用户' def get_short_name(self): #此函数必须,在默认admin页面展现的时候,会用到该函数 return self.chinesename def get_username(self): return self.username def get_full_name(self): return self.chinesename # On Python 3: def __str__(self): #如果你使用的是python3,请用def __str__(self)代替 def __unicode__(self) def __unicode__(self): return self.chinesename def has_perm(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
4、修改admin.py:
# coding=utf-8 from django.contrib import admin # Register your models here. # coding=utf-8 # from django.contrib import admin from django import forms from django.contrib.auth.models import Group from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import ReadOnlyPasswordHashField from account.models import MyDept from account.models import MyUser # Register your models here. class MyDeptAdmin(admin.ModelAdmin): list_display = ('id','name','updept') class UserCreationForm(forms.ModelForm): """A form for creating new users. Includes all the required fields, plus a repeated passroleword.""" password1 = forms.CharField(label='Password', widget=forms.PasswordInput) password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) class Meta: model = MyUser fields = ('username','email', 'dep') 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 = MyUser fields = ['username','chinesename','email', 'password', 'is_active', 'is_admin','dep'] 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 MyUserAdmin(UserAdmin): # 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','chinesename','phone','email', 'is_admin','dep') list_filter = ('username','email') filter_horizontal=() #注意:如果user模型中没有manytomanyfiled 需要在admin中修改,一定要加上此句。不然django会自动将groups左右filter_horizontal的参数来供用户选择,而本例中在定义user模型是未定义groups,会导致报错。 #另:filter_horizontal()作用是选择manytomanyfiled字段的值。 fieldsets = ( (None, {'fields': ('username','chinesename','phone','email', 'password','dep')}), ) # 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','chinesename','phone','email', 'password1', 'password2','dep')} ), ) search_fields = ('username',) ordering = ('username',) admin.site.register(MyDept,MyDeptAdmin) admin.site.register(MyUser, MyUserAdmin) admin.site.unregister(Group)
5、设置项目使用上面新增的User模型,修改settings.py
安装app:
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'account', #新增的app:account )
设置使用新的user模型,在settings.py中新增:
AUTH_USER_MODEL = 'account.MyUser'
6、同步数据库:
7、通过runserver启动服务后访问admin:
Hello, admin.
Interesting website, really!
But "Search" function on it doesnt work. Sad.
P.S. Where I can get XEvil4.0 for free?
It's best captcha solver, included Google ReCaptcha.
Need it for white SEO. Thanks.
Hello. And Bye.