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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
python如何在列表、字典中筛选数据
Mar 19 Python
python中单例常用的几种实现方法总结
Oct 13 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
Django的性能优化实现解析
Jul 30 Python
Django 实现对已存在的model进行更改
Mar 28 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
新手必备Python开发环境搭建教程
May 28 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编程语言开发动态WAP页面
2006/10/09 PHP
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
jquery图片切换插件
2015/03/16 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
Python类的继承用法示例
2019/01/31 Python
用Python解决x的n次方问题
2019/02/08 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
如何执行一个shell程序
2012/11/23 面试题
运动会邀请函范文
2014/01/31 职场文书
《藏戏》教学反思
2014/02/11 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
校园广播稿范文
2015/08/19 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python