django admin 操作重写用户模型 实例 带用户和权限组的

 项目目录结构

续:自定义权限限制url访问权限:点我

models.py

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


class MyUserManager(UserManager): #这里是重写了创建用户和超级用户的方法,因为自己的表中不需要用户写如emali
                                # ,所以这里去掉了这个email参数,就不用写了
    use_in_migrations = True

    def _create_user(self, username, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError('The given username must be set')
        username = self.model.normalize_username(username)
        user = self.model(username=username, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(username, password, **extra_fields)

    def create_superuser(self, username, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(username, password, **extra_fields)


class MyUser(PermissionsMixin,AbstractBaseUser):
    REQUIRED_FIELDS = ['phone']
    USERNAME_FIELD = 'username'
    username = models.CharField('username',max_length=11,unique=True)
    password = models.CharField('password', max_length=512) #这个值要尽量大,因为保存到数据库中的密码是hash之后的数据,不是明文的
    phone = models.CharField('phone',blank=True,max_length=11)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = MyUserManager()

    def get_full_name(self):
        # The user is identified by their username
        return self.username

    def get_short_name(self):
        # The user is identified by their username
        return self.username

    def __unicode__(self):
        return self.username
    #
    # 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_staff

 

admin.py

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField

from accounts.models import MyUser

admin.site.register(MyUser)

settings.py   一定要加这句话

AUTH_USER_MODEL = 'accounts.MyUser'

注意:这个一定要在项目刚创建的时候写好,然后在开始第一次的  python  manage.py makemigrations     python manage.py migrate

 效果如下

models.py

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


class MyUserManager(UserManager): #这里是重写了创建用户和超级用户的方法,因为自己的表中不需要用户写如emali
                                # ,所以这里去掉了这个email参数,就不用写了
    use_in_migrations = True

    def _create_user(self, username, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError('The given username must be set')
        username = self.model.normalize_username(username)
        user = self.model(username=username, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(username, password, **extra_fields)

    def create_superuser(self, username, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(username, password, **extra_fields)


class MyUser(PermissionsMixin,AbstractBaseUser):
    REQUIRED_FIELDS = ['phone']
    USERNAME_FIELD = 'username'
    username = models.CharField('username',max_length=11,unique=True)
    password = models.CharField('password', max_length=512) #这个值要尽量大,因为保存到数据库中的密码是hash之后的数据,不是明文的
    phone = models.CharField('phone',blank=True,max_length=11)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = MyUserManager()

    def get_full_name(self):
        # The user is identified by their username
        return self.username

    def get_short_name(self):
        # The user is identified by their username
        return self.username

    def __unicode__(self):
        return self.username
    #
    # 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_staff
View Code

 

views.py   用户登陆和用户注册

from django.shortcuts import render,redirect,HttpResponse
from django.contrib import auth
# Create your views here.
from accounts.models import MyUser

def log_in(request):

    if request.method=="POST":
        username=request.POST['user']
        password=request.POST['pwd']
        print(username,password,'zheshi dengl xixni========')
        user = auth.authenticate(username=username,password=password)

        if user:
            #设置session内部的字典内容
            auth.login(request,user)
            #登录成功就将url重定向到后台的url
            return HttpResponse('登陆成功')
        else:
            return redirect('/accounts/login/')
    #登录不成功或第一访问就停留在登录页面
    return render(request,'login.html')


def sign_up(request):
    state = None
    if request.method == 'POST':

        password = request.POST.get('pwd1', '')
        repeat_password = request.POST.get('pwd2', '')
        phone = request.POST.get('phone', '')
        username = request.POST.get('user', '')
        if MyUser.objects.filter(username=username):
            state = 'user_exist'
        else:
            if password == repeat_password:
                new_user = MyUser.objects.create_user(username=username, password=password, phone=phone)
                new_user.save()

                return HttpResponse('成功')
                # return redirect('/book/')
            state = '密码两次不一致'
    content = {
        'state': state,
        'user': None,}
    return render(request, 'sign_up.html', content)

urls.py

from django.urls import path
from accounts import views

urlpatterns = [
    path('login/', views.log_in),
    path('signup/', views.sign_up),
]

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/accounts/login/" method="post">
    <p>用户名: <input type="text" name="user"></p>
    <p>密码: <input type="password" name="pwd"></p>
    <p><input type="submit"></p>
</form>


</body>
</html>
View Code

sign_up.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/accounts/signup/" method="post">
    <p>用户名: <input type="text" name="user"></p>
    <p>密码: <input type="password" name="pwd1"></p>
    <p>确认密码: <input type="password" name="pwd2"></p>
    <p>手机号: <input type="text" name="phone"></p>
    <p><input type="submit"></p>
</form>


</body>
</html>
View Code

 项目文件:点我

posted on 2018-11-28 14:30  王大拿  阅读(1545)  评论(0)    收藏  举报

导航