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的内存泄漏及gc模块的使用分析
Jul 16 Python
Python中分数的相关使用教程
Mar 30 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
Python Requests安装与简单运用
Apr 07 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
Python异常处理知识点总结
Feb 18 Python
如何在python中写hive脚本
Nov 08 Python
python 创建一维的0向量实例
Dec 02 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
使用OpenCV去除面积较小的连通域
Jul 05 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环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
深入Python解释器理解Python中的字节码
2015/04/01 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
户外用品商店创业计划书
2014/01/29 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
促销活动总结模板
2014/07/01 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
于丹论语心得观后感
2015/06/15 职场文书
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS