【Django】:Admin配置管理

Admin创建登录用户

数据库结构表:

from django.db import models

# Create your models here.

class UserProfile(models.Model):
    '''
    用户信息
    '''
    name = models.CharField(u'姓名',max_length=32)
    email = models.EmailField(u'邮箱')
    telephone = models.CharField(u'座机',max_length=32)
    mobile = models.IntegerField(u'手机')

    class Meta:
        verbose_name_plural =  '用户信息表'

settings文件注册app,然后执行命令:

C:UsersLPycharmProjectss14homeworkCmdbManage>python manage.py makemigrations
C:UsersLPycharmProjectss14homeworkCmdbManage>python manage.py migrate

admin.py文件中注册modlels:

from django.contrib import admin
from repository import models

# Register your models here.

admin.site.register(models.UserProfile)

最后生成admin登录用户密码:

C:UsersLPycharmProjectss14homeworkCmdbManage>python manage.py createsuperuser 

结果:

利用Admin进行用户验证

html登录页面:

<div class="container">

      <form class="form-signin" method="POST"> {% csrf_token %}
        <h2 class="form-signin-heading">PerfectCRM Login</h2>
        <label for="username" class="sr-only"></label>
        <input type="text" id="username" class="form-control" name="username" placeholder="Username" required autofocus>
        <label for="inputPassword" class="sr-only"></label>
        <input type="password" id="inputPassword" class="form-control" name="password" placeholder="Password" required>

        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
      </form>

</div>
login.html

数据库表结构:

from django.contrib.auth.models import  User
class UserProfile(models.Model):
    '''员工用户表'''
    user = models.OneToOneField(User)  #关联django Admin user
    name = models.CharField(max_length=32)
    roles = models.ManyToManyField("Role")

    class Meta:
        verbose_name_plural = '用户表'

    def __str__(self):
        return self.name

处理函数: 

from django.shortcuts import render,redirect
from django.contrib.auth import authenticate
from django.contrib.auth import login,logout

def acc_login(request):
    '''登录'''
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 利用django自带的认证系统进行系统认证 正确返回user对象 错误返回None
        user = authenticate(username=username,password=password)
        if user:
            #print(user.userprofile.name)  打印对象内的信息
            login(request,user)     # 认证成功后自动添加到session中,前端通过request可直接调用
            return redirect('/crm')

    return render(request,'login.html')

def acc_logout(request):
    logout(request)  #情况session登录信息

    return redirect('/login')

登录后前端进行调用{{ request.user.userprofile.name }},利用Admin进行用户关联认证后,还可以用到下面装饰器认证的方法

自带装饰器认证:

from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.contrib.auth.decorators import login_required

@login_required
def dashboard(request):

    return render(request,'crm/dashboard.html')

settings配置:

# login_required 认证失败后的跳转地址 默认跳转地址为http://127.0.0.1:8000/accounts/login/?next=/crm/
LOGIN_URL = '/login/'

  

自定义Admin表显示样式:

数据库表结构:

from django.db import models
from django.contrib.auth.models import  User
# Create your models here.

class Customer(models.Model):
    '''潜在客户信息'''
    name = models.CharField(max_length=32,blank=True,null=True)
    qq = models.CharField(max_length=64,unique=True)
    wechat = models.CharField(max_length=64,blank=True,null=True)
    age = models.PositiveIntegerField(blank=True,null=True)
    gender = models.PositiveIntegerField(choices=((0,'Female'),(1,'Male')),blank=True,null=True)
    phone = models.PositiveIntegerField(blank=True,null=True)  #正整数
    source_choices = (
        (0,'Baidu商桥'),
        (1,'51CTO'),
        (2,'QQ群'),
        (3,'知乎'),
        (4,'SOGO'),
        (5,'转介绍'),
        (6,'其他'),
    )
    source = models.SmallIntegerField(choices=source_choices) # get_source_display 显示具体内容
    referral_from = models.ForeignKey('Customer',related_name='my_referrals',blank=True,null=True) # 自关联,字段可写slef,必须写related_name
    consult_courses = models.ManyToManyField(to='Course')
    status_choices = (
        (0,'已报名'),(1,'未报名'),(2,'已退学'),(3,'其他')
    )
    status = models.SmallIntegerField(choices=status_choices)
    consultant = models.ForeignKey(to="UserProfile",verbose_name='课程顾问')
    consult_content = models.TextField(max_length=1024)
    data = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = '客户表'

    def __str__(self):
        return self.name



class Enrollment(models.Model):
    '''注册用户'''
    customer = models.ForeignKey('Customer')
    class_grade = models.ForeignKey('ClassList')
    enrollment_date = models.DateField()

    class Meta:
        unique_together = ('customer', 'class_grade')   #联合唯一
        verbose_name_plural = '注册用户表'

    def __str__(self):
        return self.customer


class FollowUpRecord(models.Model):
    '''销售跟进记录'''
    customer = models.ForeignKey('Customer')
    content = models.TextField(max_length=1024)
    status_choices = (
        (0,'绝无报名计划'),
        (1,'一个月内报名'),
        (2,'两周内报名'),
        (3,'已报其他机构'),
    )
    status = models.SmallIntegerField(choices=status_choices)
    consultant = models.ForeignKey(to="UserProfile", verbose_name='课程顾问')
    data = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = '跟进记录表'

    def __str__(self):
        return self.customer


class Course(models.Model):
    '''课程Python,Go'''
    name = models.CharField(unique=True,max_length=32)
    price = models.PositiveIntegerField(default=19800)
    outline = models.TextField(max_length=1024)

    class Meta:
        verbose_name_plural = '课程表'

    def __str__(self):
        return self.name

class ClassList(models.Model):
    '''班级s14,g1'''
    course = models.ForeignKey("Course")
    semester = models.PositiveIntegerField(verbose_name='学期')
    class_type_choices = ((0,'脱产'),(1,'周末'),(2,'网络'))
    branch = models.ForeignKey("Branch")
    class_type = models.PositiveIntegerField(choices=class_type_choices)
    teachers = models.ManyToManyField(to='UserProfile')
    start_date = models.DateField()
    end_date = models.DateField()

    class Meta:
        verbose_name_plural = '班级表'

    def __str__(self):
        return self.name


class CourseRecord(models.Model):
    '''每节课上课记录'''
    class_grade = models.ForeignKey('ClassList')
    day_num = models.PositiveIntegerField(verbose_name='节次')
    teacher = models.ForeignKey('UserProfile')
    CourseContent = models.TextField(verbose_name="课程内容", max_length=1024)
    has_homework = models.BooleanField(default=True)        #布尔类型
    homework_title = models.CharField(max_length=128, blank=True, null=True)
    homework_requirement = models.TextField(verbose_name="作业需求", max_length=1024, blank=True, null=True)

    class Meta:
        unique_together = ("class_grade", "day_num")
        verbose_name_plural = '课节次表'

    def __str__(self):
        return " daynum:%s" % (self.day_number)


class StudyRecord(models.Model):
    '''每个学生上的每节课的成绩记录'''
    course_record = models.ForeignKey("CourseRecord")
    student = models.ForeignKey("Enrollment")
    score_choices = ((100, "A+"),
                     (90, "A"),
                     (85, "B+"),
                     (80, "B"),
                     (75, "B-"),
                     (70, "C+"),
                     (65, "C"),
                     (40, "C-"),
                     (-20, "D"),
                     (-50, "COPY"),
                     (0, "N/A"),
                     )
    score = models.SmallIntegerField(choices=score_choices)
    show_status_choices = (
        (0, "缺勤"), (1, "已签到"), (2, "迟到")
    )
    show_status = models.SmallIntegerField(choices=show_status_choices)
    grade_comment = models.TextField(max_length=1024, blank=True, null=True)

    class Meta:
        unique_together = ("course_record", "student")
        verbose_name_plural = '学员成绩记录表'

    def __str__(self):
        return "%s  daynum:%s" % (self.course_record, self.student)


class UserProfile(models.Model):
    '''员工用户表'''
    user = models.OneToOneField(User)
    name = models.CharField(max_length=32)

    roles = models.ManyToManyField("Role")

    class Meta:
        verbose_name_plural = '用户表'

    def __str__(self):
        return self.name

class Role(models.Model):
    """角色表"""
    name = models.CharField(unique=True,max_length=32)
    menus = models.ManyToManyField("Menu")

    class Meta:
        verbose_name_plural = '角色表'

    def __str__(self):
        return self.name


class Branch(models.Model):
    """分校"""
    name = models.CharField(unique=True,max_length=128)

    class Meta:
        verbose_name_plural = '分校表'

    def __str__(self):
        return self.name


class Menu(models.Model):
    """动态菜单"""
    name = models.CharField(unique=True,max_length=32)
    url_type = models.SmallIntegerField(choices=((0,'relative_name'),(1,'absolute_url')))
    url_name = models.CharField(unique=True,max_length=128)

    class Meta:
        verbose_name_plural = '菜单表'

    def __str__(self):
        return self.name
models.py

注册admin:

class CustomerAdmin(admin.ModelAdmin):
    # 显示字段 按顺序排序
    list_display = ('id', 'name', 'qq', 'consultant', 'source', 'consult_content', 'status', 'data')
    # filter过滤条件
    list_filter = ('source', 'status', 'consultant')
    # 检索条件
    search_fields = ('qq', 'name')
    # 直接在外部进行更改
    list_editable = ('status',)
    # 字段只读
    readonly_fields = ('name',)
    # 分页
    list_per_page = 2
    # 自定义actions方法
    actions = ['action_test']
    def action_test(self, request, querysets):
        querysets.update(status=0)

admin.site.register(models.Customer, CustomerAdmin)
admin.site.register(models.FollowUpRecord)
admin.site.register(models.Enrollment)
admin.site.register(models.Course)
admin.site.register(models.ClassList)
admin.site.register(models.StudyRecord)
admin.site.register(models.UserProfile)
admin.site.register(models.Branch)
admin.site.register(models.Role)
admin.site.register(models.Menu)
admin.site.register(models.CourseRecord)

显示效果:

原文地址:https://www.cnblogs.com/lianzhilei/p/6477660.html