django admin 根据choice字段选择的不同来显示不同的页面方式


Posted in Python onMay 13, 2020

我就废话不多说了,大家还是直接看代码吧!

一、举例

tip/tip.js
    var react = function () {
    if (django.jQuery('#id_tiptype').val() == 'content') {
      django.jQuery('#id_content').parent().parent().show(500);
      django.jQuery('#id_image').parent().parent().hide(500);
      django.jQuery('#id_cropping').parent().parent().hide(500);
    }
    else {
      django.jQuery('#id_content').parent().parent().hide(500);
      django.jQuery('#id_image').parent().parent().show(500);
      django.jQuery('#id_cropping').parent().parent().show(500);
    }
    };

    #当选择的类型改变的时候触发react函数
    django.jQuery(function () {
      react();
      django.jQuery('#id_tiptype').on('change', react);
    });

二、admin.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin
from image_cropping import ImageCroppingMixin

from salmonella.admin import SalmonellaMixin

from tip.models import Tip,TipTag

@admin.register(Tip)
class TipAdmin(ImageCroppingMixin, SalmonellaMixin, admin.ModelAdmin):
  # search_fields = ('tiptype',)
  list_filter = ('enabled',)
  list_display = ('tiptype', 'enabled', 'get_tag','image')
  salmonella_fields = ('tags', )



  # fields = ('tiptype', 'enabled','tags','image')

  def get_tag(self, obj):
    print(obj.tags.all())
    if obj.tags.all():
      tag_list = [i.name for i in obj.tags.all()]
      return ','.join(tag_list)
    else:
      return ''

  get_tag.short_description = '小贴士标签'

  class Media():
    js = ('tip/tip.js',)


@admin.register(TipTag)
class TiptagAdmin(admin.ModelAdmin):
  search_fields = ('name', )
  list_display = ("name", )

补充知识:Django之自定义用户权限(自定义RBAC组件)

RBAC组件

rbac 组件一般我们用于权限的校验,帮助我们更好的管理用户认证信息,不同的用户权限不同,访问的界面展示也不相同

什么是权限: 一个含有正则表达式的 url

基于 RBAC 设计表关系:

django admin 根据choice字段选择的不同来显示不同的页面方式

class User(models.Model):
  class Meta:
    # 此处设置 admin 中显示名称
    verbose_name = verbose_name_plural = '用户表'

  name = models.CharField(max_length=32)
  pwd = models.CharField(max_length=32)
  roles = models.ManyToManyField(to='Role')

  def __str__(self):
    return self.name

class Role(models.Model):
  class Meta:
    verbose_name = verbose_name_plural = '职位表'

  title = models.CharField(max_length=32)
  permissions = models.ManyToManyField(to='Permission')

  def __str__(self):
    return self.title

class Permission(models.Model):
  class Meta:
    verbose_name = verbose_name_plural = '权限表'

  title = models.CharField(max_length=32)
  url = models.CharField(max_length=32)
 menu=models.ForeignKey("Menu",on_delete=models.CASCADE,null=True)
  
  def __str__(self):
    return self.title
  
class Menu(models.Model):
  class Meta:
    verbose_name = verbose_name_plural = '菜单表'
    
  title = models.CharField(max_length=32, verbose_name='菜单')
  icon = models.CharField(max_length=32, verbose_name='图标', null=True, blank=True)

添加需要的权限信息

任何利用中间件和自定义的模块 传输和获取 当前用户的权限信息

# 通过自定义 middleware 模块在 setting 中加入,引入中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
import re

class PermissionMiddleWare(MiddlewareMixin):

  def process_request(self, request):

    current_path = request.path
    # 设置白名单
    for reg in ['/login/', '/admin/*']:
      ret = re.search(reg, current_path)
      if ret:
        return None

    # 校验是否登录
    user_id = request.session.get('user_id')
    if not user_id:
      return redirect('/login/')

    # 校验权限
    permission_list = request.session.get("permission_list")
    for reg in permission_list:
      reg = "^%s$" % reg
      ret = re.search(reg, current_path)
      if ret:
        return None

    return HttpResponse("无权访问!")

rbac 自定义模块

from app1.models import *

def initial_sesson(user, request):
  """
  功能:将当前登录人的所有权限录入 session 中
  :param user:当前登录人
  :param request:
  :return:
  """
  # 查询当前登录人的所有权限列表
  permissions = Role.objects.filter(user=user).values('permissions__url')
  print('roles', permissions)

  permissions_list = []
  for item in permissions:
    permissions_list.append(item['permissions__url'])

  # 将当前登录人的权限列表注入 session 中
  request.session['permission_list'] = permissions_list

django admin 根据choice字段选择的不同来显示不同的页面方式

动态显示菜单权限

动态获取显示菜单,注意本次显示是后台操作

需要获取当前用户的权限信息,获取 url 和 是否为菜单,以及所带的 icon 图标。因为设计到传值的问题,于是我们产生了自定过滤器。

首先自定过滤器

# web.py 文件中
from django.utils.safestring import mark_safe
from django.template import Library
import re
register =Library()

@register.inclusion_tag("rbac/menu.html")
# 将当前函数的 permission_menu_dict 传给 rbac 的 menu.html
def get_menu_styles(request):
  """
  自定义过滤器
  :param request:传入当前用户菜单信息 
  :return: 
  """
  permission_menu_dict = request.session.get("permission_menu_dict")
  print("permission_menu_dict",permission_menu_dict)
  return {"permission_menu_dict":permission_menu_dict}

在 menu.html 中书写

# menu.html
<div class="multi-menu">
{% for item in permission_menu_dict.values %}
<div class="item">
<div class="title"><i class="{{ item.menu_icon }}"></i>{{ item.menu_title }}</div>
<div class="body">
{% for foo in item.children %}
<a href="{{ foo.url }}" rel="external nofollow" >{{ foo.title }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>

使用自定义的组件

<div class="left-menu">
<div class="menu-body">
{% load web %}
{% get_menu_styles request %}
</div>
</div>

整体样图

django admin 根据choice字段选择的不同来显示不同的页面方式

以上这篇django admin 根据choice字段选择的不同来显示不同的页面方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从Python的源码来解析Python下的freeblock
May 11 Python
在Python的列表中利用remove()方法删除元素的教程
May 21 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
CentOS7安装Python3的教程详解
Apr 10 Python
python全栈知识点总结
Jul 01 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
python selenium xpath定位操作
Sep 01 Python
Jupyter notebook如何实现指定浏览器打开
May 13 #Python
基于FME使用Python过程图解
May 13 #Python
django rest framework serializers序列化实例
May 13 #Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 #Python
Python使用Numpy模块读取文件并绘制图片
May 13 #Python
python pyecharts 实现一个文件绘制多张图
May 13 #Python
Django与pyecharts结合的实例代码
May 13 #Python
You might like
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
python对象与json相互转换的方法
2019/05/07 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
python collections模块的使用
2020/10/16 Python
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
创意活动策划书
2014/01/15 职场文书
演讲主持词
2014/03/18 职场文书
房地产活动策划方案
2014/05/14 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
党校毕业心得体会
2014/09/13 职场文书
本溪水洞导游词
2015/02/11 职场文书
求职推荐信范文
2015/03/27 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
2015年售票员工作总结
2015/04/29 职场文书
在职证明格式样本
2015/06/15 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS