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下的Mysql模块MySQLdb安装详解
Apr 09 Python
python使用mailbox打印电子邮件的方法
Apr 30 Python
小小聊天室Python代码实现
Aug 17 Python
Python变量赋值的秘密分享
Apr 03 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
Python基于百度云文字识别API
Dec 13 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 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学习之变量的使用
2011/05/29 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
PHP Session 变量的使用方法详解与实例代码
2013/09/11 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
专业销售业务员求职信
2013/11/18 职场文书
四好少年事迹材料
2014/01/12 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书