zoukankan      html  css  js  c++  java
  • 【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)
    

    显示效果:

  • 相关阅读:
    【OPENGL】第二篇 HELLO OPENGL(续)
    【转载】关于在vs2013中配置opengl红宝书第八版环境
    【OpenGL】 第一篇 OpenGL概览
    【OpenGL】第二篇 Hello OpenGL
    【OpenGL】VAO与VBO
    面试题五 数组中出现次数超过一半的数字 时间为O(n)
    intellij idea激活,免费激活方式分享
    使用接口还是使用抽象类
    CRM(Customer Relationship Management)
    java提高篇-----字符串
  • 原文地址:https://www.cnblogs.com/lianzhilei/p/6477660.html
Copyright © 2011-2022 走看看