</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="python keyword">class <code class="python plain">PermissionsMixin(models.Model):
<div class="line number2 index1 alt1"><code class="python spaces"><code class="python comments">"""
<div class="line number3 index2 alt2"><code class="python spaces"><code class="python comments">A mixin class that adds the fields and methods necessary to support
<div class="line number4 index3 alt1"><code class="python spaces"><code class="python comments">Django's Group and Permission model using the ModelBackend.
<div class="line number5 index4 alt2"><code class="python spaces"><code class="python comments">"""
<div class="line number6 index5 alt1"><code class="python spaces"><code class="python plain">is
superuser <code class="python keyword">= <code class="python plain">models.BooleanField((<code class="python string">'superuser status'<code class="python plain">),default<code class="python keyword">=<code class="python color1">False<code class="python plain">,
<div class="line number7 index6 alt2"><code class="python spaces"><code class="python plain">help
text<code class="python keyword">=<code class="python plain">(<code class="python string">'Designates that this user has all permissions without '
<div class="line number8 index7 alt1"><code class="python spaces"><code class="python string">'explicitly assigning them.'<code class="python plain">))
<div class="line number9 index8 alt2"><code class="python spaces"><code class="python plain">groups <code class="python keyword">= <code class="python plain">models.ManyToManyField(Group,verbose
name<code class="python keyword">=<code class="python plain">(<code class="python string">'groups'<code class="python plain">),
<div class="line number10 index9 alt1"><code class="python spaces"><code class="python plain">blank<code class="python keyword">=<code class="python color1">True<code class="python plain">,help
text<code class="python keyword">=<code class="python plain">(<code class="python string">'The groups this user belongs to. A user will '
<div class="line number11 index10 alt2"><code class="python spaces"><code class="python string">'get all permissions granted to each of '
<div class="line number12 index11 alt1"><code class="python spaces"><code class="python string">'their groups.'<code class="python plain">),
<div class="line number13 index12 alt2"><code class="python spaces"><code class="python plain">related_name<code class="python keyword">=<code class="python string">"user_set"<code class="python plain">,related_query_name<code class="python keyword">=<code class="python string">"user"<code class="python plain">)
<div class="line number14 index13 alt1"><code class="python spaces"><code class="python plain">user_permissions <code class="python keyword">= <code class="python plain">models.ManyToManyField(Permission,
<div class="line number15 index14 alt2"><code class="python spaces"><code class="python plain">verbose
name<code class="python keyword">=<code class="python plain">(<code class="python string">'user permissions'<code class="python plain">),blank<code class="python keyword">=<code class="python color1">True<code class="python plain">,
<div class="line number16 index15 alt1"><code class="python spaces"><code class="python plain">help
text<code class="python keyword">=<code class="python plain">(<code class="python string">'Specific permissions for this user.'<code class="python plain">),
<div class="line number17 index16 alt2"><code class="python spaces"><code class="python plain">related_name<code class="python keyword">=<code class="python string">"user_set"<code class="python plain">,related_query_name<code class="python keyword">=<code class="python string">"user"<code class="python plain">)
<div class="line number18 index17 alt1">
<div class="line number19 index18 alt2"><code class="python spaces"><code class="python keyword">class <code class="python plain">
Meta:
<div class="line number20 index19 alt1"><code class="python spaces"><code class="python plain">abstract <code class="python keyword">= <code class="python color1">True
<div class="line number21 index20 alt2">
<div class="line number22 index21 alt1"><code class="python spaces"><code class="python keyword">def <code class="python plain">get_group_permissions(<code class="python color1">self<code class="python plain">,obj<code class="python keyword">=<code class="python color1">None<code class="python plain">):
<div class="line number23 index22 alt2"><code class="python spaces"><code class="python comments">"""
<div class="line number24 index23 alt1"><code class="python spaces"><code class="python comments">Returns a list of permission strings that this user has through their
<div class="line number25 index24 alt2"><code class="python spaces"><code class="python comments">groups. This method queries all available auth backends. If an object
<div class="line number26 index25 alt1"><code class="python spaces"><code class="python comments">is passed in,only permissions matching this object are returned.
<div class="line number27 index26 alt2"><code class="python spaces"><code class="python comments">"""
<div class="line number28 index27 alt1"><code class="python spaces"><code class="python plain">permissions <code class="python keyword">= <code class="python functions">set<code class="python plain">()
<div class="line number29 index28 alt2"><code class="python spaces"><code class="python keyword">for <code class="python plain">backend <code class="python keyword">in <code class="python plain">auth.get_backends():
<div class="line number30 index29 alt1"><code class="python spaces"><code class="python keyword">if <code class="python functions">hasattr<code class="python plain">(backend,<code class="python string">"get_group_permissions"<code class="python plain">):
<div class="line number31 index30 alt2"><code class="python spaces"><code class="python plain">permissions.update(backend.get_group_permissions(<code class="python color1">self<code class="python plain">,obj))
<div class="line number32 index31 alt1"><code class="python spaces"><code class="python keyword">return <code class="python plain">permissions
<div class="line number33 index32 alt2">
<div class="line number34 index33 alt1"><code class="python spaces"><code class="python keyword">def <code class="python plain">get_all_permissions(<code class="python color1">self<code class="python plain">,obj<code class="python keyword">=<code class="python color1">None<code class="python plain">):
<div class="line number35 index34 alt2"><code class="python spaces"><code class="python keyword">return <code class="python plain">_user_get_all_permissions(<code class="python color1">self<code class="python plain">,obj)
<div class="line number36 index35 alt1">
<div class="line number37 index36 alt2"><code class="python spaces"><code class="python keyword">def <code class="python plain">has_perm(<code class="python color1">self<code class="python plain">,perm,obj<code class="python keyword">=<code class="python color1">None<code class="python plain">):
<div class="line number38 index37 alt1"><code class="python spaces"><code class="python comments">"""
<div class="line number39 index38 alt2"><code class="python spaces"><code class="python comments">Returns True if the user has the specified permission. This method
<div class="line number40 index39 alt1"><code class="python spaces"><code class="python comments">queries all available auth backends,but returns immediately if any
<div class="line number41 index40 alt2"><code class="python spaces"><code class="python comments">backend returns True. Thus,a user who has permission from a single
<div class="line number42 index41 alt1"><code class="python spaces"><code class="python comments">auth backend is assumed to have permission in general. If an object is
<div class="line number43 index42 alt2"><code class="python spaces"><code class="python comments">provided,permissions for this specific object are checked.
<div class="line number44 index43 alt1"><code class="python spaces"><code class="python comments">"""
<div class="line number45 index44 alt2">
<div class="line number46 index45 alt1"><code class="python spaces"><code class="python comments"># Active superusers have all permissions.
<div class="line number47 index46 alt2"><code class="python spaces"><code class="python keyword">if <code class="python color1">self<code class="python plain">.is_active <code class="python keyword">and <code class="python color1">self<code class="python plain">.is_superuser:
<div class="line number48 index47 alt1"><code class="python spaces"><code class="python keyword">return <code class="python color1">True
<div class="line number49 index48 alt2">
<div class="line number50 index49 alt1"><code class="python spaces"><code class="python comments"># Otherwise we need to check the backends.
<div class="line number51 index50 alt2"><code class="python spaces"><code class="python keyword">return <code class="python plain">_user_has_perm(<code class="python color1">self<code class="python plain">,obj)
<div class="line number52 index51 alt1">
<div class="line number53 index52 alt2"><code class="python spaces"><code class="python keyword">def <code class="python plain">has_perms(<code class="python color1">self<code class="python plain">,perm_list,obj<code class="python keyword">=<code class="python color1">None<code class="python plain">):
<div class="line number54 index53 alt1"><code class="python spaces"><code class="python comments">"""
<div class="line number55 index54 alt2"><code class="python spaces"><code class="python comments">Returns True if the user has each of the specified permissions. If
<div class="line number56 index55 alt1"><code class="python spaces"><code class="python comments">object is passed,it checks if the user has all
required perms for this
<div class="line number57 index56 alt2"><code class="python spaces"><code class="python comments">object.
<div class="line number58 index57 alt1"><code class="python spaces"><code class="python comments">"""
<div class="line number59 index58 alt2"><code class="python spaces"><code class="python keyword">for <code class="python plain">perm <code class="python keyword">in <code class="python plain">perm_list:
<div class="line number60 index59 alt1"><code class="python spaces"><code class="python keyword">if <code class="python keyword">not <code class="python color1">self<code class="python plain">.has_perm(perm,obj):
<div class="line number61 index60 alt2"><code class="python spaces"><code class="python keyword">return <code class="python color1">False
<div class="line number62 index61 alt1"><code class="python spaces"><code class="python keyword">return <code class="python color1">True
<div class="line number63 index62 alt2">
<div class="line number64 index63 alt1"><code class="python spaces"><code class="python keyword">def <code class="python plain">has_module_perms(<code class="python color1">self<code class="python plain">,app_label):
<div class="line number65 index64 alt2"><code class="python spaces"><code class="python comments">"""
<div class="line number66 index65 alt1"><code class="python spaces"><code class="python comments">Returns True if the user has any permissions in the given app label.
<div class="line number67 index66 alt2"><code class="python spaces"><code class="python comments">Uses pretty much the same logic as has_perm,above.
<div class="line number68 index67 alt1"><code class="python spaces"><code class="python comments">"""
<div class="line number69 index68 alt2"><code class="python spaces"><code class="python comments"># Active superusers have all permissions.
<div class="line number70 index69 alt1"><code class="python spaces"><code class="python keyword">if <code class="python color1">self<code class="python plain">.is_active <code class="python keyword">and <code class="python color1">self<code class="python plain">.is_superuser:
<div class="line number71 index70 alt2"><code class="python spaces"><code class="python keyword">return <code class="python color1">True
<div class="line number72 index71 alt1">
<div class="line number73 index72 alt2"><code class="python spaces"><code class="python keyword">return <code class="python plain">_user_has_module_perms(<code class="python color1">self<code class="python plain">,app_label)
</td>
</tr>
</table>
4.3.2 Django内置的User对象就继承了AbstractBaseUser和PermissionsMixin:
源码:
An -required. Other fields are optional.
username = models.CharField(_(),max_length=,unique==_(required. 30 characters or fewer. Letters,digits and
=
aracters.),=: _(irst_name = models.CharField(_(irst name),blank== models.CharField(_(),blank== models.EmailField(_(),blank== models.BooleanField(_(),==_(
= models.BooleanField(_(),==_(
= models.DateTimeField(_(),=Now)
objects </span>=<span style="color: #000000;"> UserManager()
USERNAME_FIELD </span>= <span style="color: #800000;">'</span><span style="color: #800000;">username</span><span style="color: #800000;">'</span><span style="color: #000000;">
<a href="/tag/required/" target="_blank" class="keywords">required</a>_FIELDS </span>= [<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span><span style="color: #000000;">]
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
verbose_name </span>= _(<span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span><span style="color: #000000;">)
verbose_name_plural </span>= _(<span style="color: #800000;">'</span><span style="color: #800000;">users</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">abstract</span> =<span style="color: #000000;"> True
def get_full_name(self):
</span><span style="color: #800000;">"""
Returns the first_name plus the last_name,with a space <span style="color: #0000ff;">in<span style="color: #000000;"> between.
<span style="color: #800000;">"""
full_name = <span style="color: #800000;">'<span style="color: #800000;">%s %s<span style="color: #800000;">' %<span style="color: #000000;"> (self.first_name,self.last_name)
<span style="color: #0000ff;">return<span style="color: #000000;"> full_name.strip()
def get_short_name(self):
</span><span style="color: #800000;">"</span><span style="color: #800000;">Returns the short name for the user.</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">return</span><span style="color: #000000;"> self.f<a href="/tag/irs/" target="_blank" class="keywords">irs</a>t_name
def email_user(self,subject,message,from_email</span>=None,**<span style="color: #000000;"><a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
</span><span style="color: #800000;">"""
Sends an email to <span style="color: #0000ff;">this<span style="color: #000000;"> User.
<span style="color: #800000;">"""
send_mail(subject,from_email,[self.email],**<span style="color: #000000;">kwargs)
<span style="color: #0000ff;">class<span style="color: #000000;"> User(AbstractUser):
<span style="color: #800000;">"""
Users within the Django authentication system are represented by <span style="color: #0000ff;">this<span style="color: #000000;">
model.
Username,password and email are required. Other fields are optional.
<span style="color: #800000;">"""
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta(AbstractUser.Meta):
swappable = <span style="color: #800000;">'<span style="color: #800000;">AUTH_USER_MODEL<span style="color: #800000;">'
4.3.3 PermissionsMixin提供的这些方法和属性:
is_superuser
布尔类型。 Designates that this user has all permissions without explicitly assigning them.
get_group_permissions(obj=None)
Returns a set of permission strings that the user has,through their groups.
If obj is passed in,only returns the group permissions for this specific object.
get_all_permissions(obj=None)
Returns a set of permission strings that the user has,both through group and user permissions.
If obj is passed in,only returns the permissions for this specific object.
has_perm(perm,obj=None)
Returns True if the user has the specified permission,where perm is in the format "." (see permissions). If the user is inactive,this method will always return False.
If obj is passed in,this method won’t check for a permission for the model,but for this specific object.
has_perms(perm_list,obj=None)
Returns True if the user has each of the specified permissions,where each perm is in the format ".". If the user is inactive,this method won’t check for permissions for the model,but for the specific object.
has_module_perms(package_name)
Returns True if the user has any permissions in the given package (the Django app label). If the user is inactive,this method will always return False.
5.官方提供的一个完整的例子
这是一个管理器允许的自定义user这个用户模型使用邮箱地址作为用户名,并且要求填写出生年月。it provides no permission checking,beyond a simple admin flag on the user account. This model would be compatible with all the built-in auth forms and views,except for the User creation forms. This example illustrates how most of the components work together,but is not intended to be copied directly into projects for production use.
<span style="color: #0000ff;">from<span style="color: #000000;"> django.db import models
<span style="color: #0000ff;">from<span style="color: #000000;"> django.contrib.auth.models import (
BaseUserManager,AbstractBaseUser
)
<span style="color: #0000ff;">class<span style="color: #000000;"> MyUserManager(BaseUserManager):
def create_user(self,password=<span style="color: #000000;">None):
<span style="color: #800000;">"""
<span style="color: #000000;"> Creates and saves a User with the given email,date of
birth and password.
<span style="color: #800000;">"""
<span style="color: #0000ff;">if<span style="color: #000000;"> not email:
raise ValueError(<span style="color: #800000;">'<span style="color: #800000;">Users must have an email address<span style="color: #800000;">'<span style="color: #000000;">)
user </span>=<span style="color: #000000;"> self.model(
email</span>=<span style="color: #000000;">self.<a href="/tag/nor/" target="_blank" class="keywords">nor</a>malize_email(email),date_of_birth</span>=<span style="color: #000000;">date_of_birth,)
user.set_password(password)
user.save(</span><span style="color: #0000ff;">using</span>=<span style="color: #000000;">self._db)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> user
def create_superuser(self,password):
</span><span style="color: #800000;">"""
<span style="color: #000000;"> Creates and saves a superuser with the given email,date of
birth and password.
<span style="color: #800000;">"""
user =<span style="color: #000000;"> self.create_user(email,password=<span style="color: #000000;">password,date_of_birth=<span style="color: #000000;">date_of_birth
)
user.is_admin =<span style="color: #000000;"> True
user.save(<span style="color: #0000ff;">using=<span style="color: #000000;">self._db)
<span style="color: #0000ff;">return<span style="color: #000000;"> user
<span style="color: #0000ff;">class<span style="color: #000000;"> MyUser(AbstractBaseUser):
email =<span style="color: #000000;"> models.EmailField(
verbose_name=<span style="color: #800000;">'<span style="color: #800000;">email address<span style="color: #800000;">'<span style="color: #000000;">,max_length=<span style="color: #800080;">255<span style="color: #000000;">,unique=<span style="color: #000000;">True,)
date_of_birth =<span style="color: #000000;"> models.DateField()
is_active = models.BooleanField(<span style="color: #0000ff;">default=<span style="color: #000000;">True)
is_admin = models.BooleanField(<span style="color: #0000ff;">default=<span style="color: #000000;">False)
objects </span>=<span style="color: #000000;"> MyUserManager()
USERNAME_FIELD </span>= <span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span><span style="color: #000000;">
<a href="/tag/required/" target="_blank" class="keywords">required</a>_FIELDS </span>= [<span style="color: #800000;">'</span><span style="color: #800000;">date_of_birth</span><span style="color: #800000;">'</span><span style="color: #000000;">]
def get_full_name(self):
# The user </span><span style="color: #0000ff;">is</span><span style="color: #000000;"> identified by their email address
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.email
def get_short_name(self):
# The user </span><span style="color: #0000ff;">is</span><span style="color: #000000;"> identified by their email address
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.email
def __str__(self): # __unicode__ on Python </span><span style="color: #800080;">2</span>
<span style="color: #0000ff;">return</span><span style="color: #000000;"> self.email
def has_perm(self,obj</span>=<span style="color: #000000;">None):
</span><span style="color: #800000;">"</span><span style="color: #800000;">Does the user have a specific permission?</span><span style="color: #800000;">"</span><span style="color: #000000;">
# Simplest possible answer: Yes,always
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
def has_module_perms(self,app_label):
</span><span style="color: #800000;">"</span><span style="color: #800000;">Does the user have permissions to view the app `app_label`?</span><span style="color: #800000;">"</span><span style="color: #000000;">
# Simplest possible answer: Yes,always
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
@property
def is_staff(self):
</span><span style="color: #800000;">"</span><span style="color: #800000;">Is the user a member of staff?</span><span style="color: #800000;">"</span><span style="color: #000000;">
# Simplest possible answer: All admins are staff
</span><span style="color: #0000ff;">return</span> self.is_admin</pre>
可以看到manager定义了create_user()和create_superuser()方法,MyUser定义了USERNAME_FIELD,required_FIELDS字段和get_full_name(),get_short_name()方法,为了能与admin一起使用,还定义了is_active,has_perm(),has_module_perms()
要在admin中注册自定义的MyUser,还需要在app的admin.py中重写UserCreationForm和UserChangeForm:
<span style="color: #0000ff;">from<span style="color: #000000;"> customauth.models import MyUser
<span style="color: #0000ff;">class<span style="color: #000000;"> UserCreationForm(forms.ModelForm):
<span style="color: #800000;">"""<span style="color: #800000;">A form for creating new users. Includes all the required
fields,plus a repeated password.<span style="color: #800000;">"""
password1 = forms.CharField(label=<span style="color: #800000;">'<span style="color: #800000;">Password<span style="color: #800000;">',widget=<span style="color: #000000;">forms.PasswordInput)
password2 = forms.CharField(label=<span style="color: #800000;">'<span style="color: #800000;">Password confirmation<span style="color: #800000;">',widget=<span style="color: #000000;">forms.PasswordInput)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> MyUser
fields </span>= (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">date_of_birth</span><span style="color: #800000;">'</span><span style="color: #000000;">)
def clean_password2(self):
# Check that the two password entries match
password1 </span>= self.cleaned_data.<span style="color: #0000ff;">get</span>(<span style="color: #800000;">"</span><span style="color: #800000;">password1</span><span style="color: #800000;">"</span><span style="color: #000000;">)
password2 </span>= self.cleaned_data.<span style="color: #0000ff;">get</span>(<span style="color: #800000;">"</span><span style="color: #800000;">password2</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">if</span> password1 and password2 and password1 !=<span style="color: #000000;"> password2:
raise forms.ValidationError(</span><span style="color: #800000;">"</span><span style="color: #800000;">Passwords don't match</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> password2
def save(self,commit</span>=<span style="color: #000000;">True):
# Save the provided password </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> hashed format
user </span>= super(UserCreationForm,self).save(commit=<span style="color: #000000;">False)
user.set_password(self.cleaned_data[</span><span style="color: #800000;">"</span><span style="color: #800000;">password1</span><span style="color: #800000;">"</span><span style="color: #000000;">])
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> commit:
user.save()
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> user
<span style="color: #0000ff;">class<span style="color: #000000;"> UserChangeForm(forms.ModelForm):
<span style="color: #800000;">"""<span style="color: #800000;">A form for updating users. Includes all the fields on
the user,but replaces the password field with admin<span style="color: #800000;">'<span style="color: #800000;">s
<span style="color: #000000;"> password hash display field.
<span style="color: #800000;">"""
password =<span style="color: #000000;"> ReadOnlyPasswordHashField()
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> MyUser
fields </span>= (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">password</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">date_of_birth</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">is_active</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">is_admin</span><span style="color: #800000;">'</span><span style="color: #000000;">)
def clean_password(self):
# Regardless of what the user provides,</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> the initial value.
# This </span><span style="color: #0000ff;">is</span><span style="color: #000000;"> done here,rather than on the field,because the
# field does not have access to the initial value
</span><span style="color: #0000ff;">return</span> self.initial[<span style="color: #800000;">"</span><span style="color: #800000;">password</span><span style="color: #800000;">"</span><span style="color: #000000;">]
<span style="color: #0000ff;">class<span style="color: #000000;"> MyUserAdmin(UserAdmin):
The forms to add and change user instances
form </span>=<span style="color: #000000;"> UserChangeForm
add_form </span>=<span style="color: #000000;"> UserCreationForm
# The fields to be used </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> <a href="/tag/dis/" target="_blank" class="keywords">dis</a>playing the User model.
# These </span><span style="color: #0000ff;">override</span> the de<a href="/tag/Finitio/" target="_blank" class="keywords">Finitio</a>ns on the <span style="color: #0000ff;">base</span><span style="color: #000000;"> UserAdmin
# that reference specific fields on auth.User.
list_<a href="/tag/dis/" target="_blank" class="keywords">dis</a>play </span>= (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">is_admin</span><span style="color: #800000;">'</span><span style="color: #000000;">)
list_filter </span>= (<span style="color: #800000;">'</span><span style="color: #800000;">is_admin</span><span style="color: #800000;">'</span><span style="color: #000000;">,)
fieldsets </span>=<span style="color: #000000;"> (
(None,{</span><span style="color: #800000;">'</span><span style="color: #800000;">fields</span><span style="color: #800000;">'</span>: (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">password</span><span style="color: #800000;">'</span><span style="color: #000000;">)}),(</span><span style="color: #800000;">'</span><span style="color: #800000;">Personal info</span><span style="color: #800000;">'</span>,{<span style="color: #800000;">'</span><span style="color: #800000;">fields</span><span style="color: #800000;">'</span>: (<span style="color: #800000;">'</span><span style="color: #800000;">date_of_birth</span><span style="color: #800000;">'</span><span style="color: #000000;">,)}),(</span><span style="color: #800000;">'</span><span style="color: #800000;">Permissions</span><span style="color: #800000;">'</span>,{<span style="color: #800000;">'</span><span style="color: #800000;">fields</span><span style="color: #800000;">'</span>: (<span style="color: #800000;">'</span><span style="color: #800000;">is_admin</span><span style="color: #800000;">'</span><span style="color: #000000;">,)
# add_fieldsets </span><span style="color: #0000ff;">is</span><span style="color: #000000;"> not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use </span><span style="color: #0000ff;">this</span><span style="color: #000000;"> attribute when creating a user.
add_fieldsets </span>=<span style="color: #000000;"> (
(None,{
</span><span style="color: #800000;">'</span><span style="color: #800000;">classes</span><span style="color: #800000;">'</span>: (<span style="color: #800000;">'</span><span style="color: #800000;">wide</span><span style="color: #800000;">'</span><span style="color: #000000;">,),</span><span style="color: #800000;">'</span><span style="color: #800000;">fields</span><span style="color: #800000;">'</span>: (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">password1</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">password2</span><span style="color: #800000;">'</span><span style="color: #000000;">)}
),)
search_fields </span>= (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span><span style="color: #000000;">,)
ordering </span>= (<span style="color: #800000;">'</span><span style="color: #800000;">email</span><span style="color: #800000;">'</span><span style="color: #000000;">,)
filter_horizontal </span>=<span style="color: #000000;"> ()
Now register the <span style="color: #0000ff;">new<span style="color: #000000;"> UserAdmin...
admin.site.register(MyUser,MyUserAdmin)
... and,since we<span style="color: #800000;">'<span style="color: #800000;">re not using Django<span style="color: #800000;">'s built-<span style="color: #0000ff;">in<span style="color: #000000;"> permissions,# unregister the Group model <span style="color: #0000ff;">from<span style="color: #000000;"> admin.
admin.site.unregister(Group)
最后,别忘了在settings.py中定义AUTH_USER_MODEL:
作者:常大鹏链接:http://www.jianshu.com/p/b993f4feff83來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
转:https://www.cnblogs.com/robinunix/p/7922403.html#_lab2_0_7
dio controls="controls" style="display: none;">
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。