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正则表达式匹配HTML页面编码
Apr 08 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
Python 迭代器与生成器实例详解
May 18 Python
Python 错误和异常代码详解
Jan 29 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
python调用自定义函数的实例操作
Jun 26 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
Python sep参数使用方法详解
Feb 12 Python
Django与数据库交互的实现
Jun 03 Python
python可视化之颜色映射详解
Sep 15 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
风格模板初级不完全修改教程
2006/10/09 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
Python从MP3文件获取id3的方法
2015/06/15 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Django框架模板介绍
2019/01/15 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
院药学专业个人求职信
2013/09/21 职场文书
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
早会开场白台词大全
2015/06/01 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书