django admin 根据choice字段选择的不同来显示不同的页面方式
作者:海燕。 发布时间:2022-04-26 06:39:10
标签:django,admin,choice,页面
我就废话不多说了,大家还是直接看代码吧!
一、举例
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 设计表关系:
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
动态显示菜单权限
动态获取显示菜单,注意本次显示是后台操作
需要获取当前用户的权限信息,获取 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>
整体样图
来源:https://www.cnblogs.com/haiyan123/p/9046487.html
0
投稿
猜你喜欢
- 一、概念介绍本质上,webpack 是一个现代JavaScript 应用程序的静态模块打包器(module bundler)。当 webpa
- 本文实例讲述了Python中顺序表原理与实现方法。分享给大家供大家参考,具体如下:Python中的顺序表Python中的list和tuple
- 1.什么是JDBCJDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口
- --已知:两种排名方式(分区和不分区):使用和不使用partition--两种计算方式(连续,不连续),对应函数:dense_rank,ra
- kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算
- ISNULL 使用指定的替换值替换 NULL。 &nb
- 最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。在
- 这是一个通过js实现的支付后的页面,点击支付会跳出一个弹窗,提示你是否要确定支付,确定后进入付后界面,该页面有着10秒倒计时,计时结束后便会
- 最近越来越多在博客上写些UX相关的内容作为分享,就涉及到跟普通博文不一样的文章建构问题。文章内容固然很重要,但排版、组织也是提高可读性和用户
- python 不能写new_loss=old_loss=[]这样 两个变量实际上是同一个list要分开写new_loss=[]Old_los
- 在Mysql中很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。但我们常在
- 目录一、Go调用C代码的原理二、在Go中使用C语言的类型1、原生类型数值类型指针类型字符串类型数组类型2、自定义类型枚举(enum)结构体(
- 语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。
- 去空格函数有如下两种:·LTRIM()LTRIM() 函数把字符串头部(左)的空格去掉,其语法如下:LTRIM (<character
- 在MongoDB中的ObjectID,可以理解为是一个不会重复的ID,这里有个链接https://www.aspxhome.com/arti
- 假设有一名为"addnewuser"的存储过程,其内容如下:Create PROCEDURE dbo
- 这篇文章讨论了Python的from <module> import *和from <package> import
- 1. Vue 路由权限控制一般有2种方法a、路由元信息(meta)b、动态加载菜单和路由(addRoutes)2 路由元信息(meta)来进
- USE NBDXMIS CREATE proc TestTimeAnySentence @sql_where varchar(8000) a
- 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写,字符串长度小于5