django admin 根據(jù)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);
}
};
#當(dāng)選擇的類型改變的時(shí)候觸發(fā)react函數(shù)
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 = '小貼士標(biāo)簽'
class Media():
js = ('tip/tip.js',)
@admin.register(TipTag)
class TiptagAdmin(admin.ModelAdmin):
search_fields = ('name', )
list_display = ("name", )
補(bǔ)充知識(shí):Django之自定義用戶權(quán)限(自定義RBAC組件)
RBAC組件
rbac 組件一般我們用于權(quán)限的校驗(yàn),幫助我們更好的管理用戶認(rèn)證信息,不同的用戶權(quán)限不同,訪問的界面展示也不相同
什么是權(quán)限: 一個(gè)含有正則表達(dá)式的 url
基于 RBAC 設(shè)計(jì)表關(guān)系:

class User(models.Model):
class Meta:
# 此處設(shè)置 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 = '權(quán)限表'
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='圖標(biāo)', null=True, blank=True)
添加需要的權(quán)限信息
任何利用中間件和自定義的模塊 傳輸和獲取 當(dāng)前用戶的權(quán)限信息
# 通過自定義 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
# 設(shè)置白名單
for reg in ['/login/', '/admin/*']:
ret = re.search(reg, current_path)
if ret:
return None
# 校驗(yàn)是否登錄
user_id = request.session.get('user_id')
if not user_id:
return redirect('/login/')
# 校驗(yàn)權(quán)限
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("無權(quán)訪問!")
rbac 自定義模塊
from app1.models import *
def initial_sesson(user, request):
"""
功能:將當(dāng)前登錄人的所有權(quán)限錄入 session 中
:param user:當(dāng)前登錄人
:param request:
:return:
"""
# 查詢當(dāng)前登錄人的所有權(quán)限列表
permissions = Role.objects.filter(user=user).values('permissions__url')
print('roles', permissions)
permissions_list = []
for item in permissions:
permissions_list.append(item['permissions__url'])
# 將當(dāng)前登錄人的權(quán)限列表注入 session 中
request.session['permission_list'] = permissions_list

動(dòng)態(tài)顯示菜單權(quán)限
動(dòng)態(tài)獲取顯示菜單,注意本次顯示是后臺(tái)操作
需要獲取當(dāng)前用戶的權(quán)限信息,獲取 url 和 是否為菜單,以及所帶的 icon 圖標(biāo)。因?yàn)樵O(shè)計(jì)到傳值的問題,于是我們產(chǎn)生了自定過濾器。
首先自定過濾器
# web.py 文件中
from django.utils.safestring import mark_safe
from django.template import Library
import re
register =Library()
@register.inclusion_tag("rbac/menu.html")
# 將當(dāng)前函數(shù)的 permission_menu_dict 傳給 rbac 的 menu.html
def get_menu_styles(request):
"""
自定義過濾器
:param request:傳入當(dāng)前用戶菜單信息
: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 根據(jù)choice字段選擇的不同來顯示不同的頁面方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 如何將浮點(diǎn)數(shù)尾部無效0去掉和無效的‘.’號(hào)
這篇文章主要介紹了python 如何將浮點(diǎn)數(shù)尾部無效0去掉和無效的‘.’號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
python對(duì)raw格式照片進(jìn)行降噪處理的方法詳解
要對(duì)RAW格式的照片進(jìn)行降噪,我們可以使用rawpy庫來讀取RAW圖像,并使用imageio庫將處理后的圖像保存為其他格式,如PNG或JPEG,本文將詳細(xì)給大家介紹python如何對(duì)raw格式照片進(jìn)行降噪處理,文中有詳細(xì)的代碼流程,需要的朋友可以參考下2023-05-05
Python 3 實(shí)現(xiàn)定義跨模塊的全局變量和使用教程
這篇文章主要介紹了Python 3 實(shí)現(xiàn)定義跨模塊的全局變量和使用,本文通過實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Python實(shí)現(xiàn)遞歸遍歷文件夾并刪除文件
本文給大家匯總了3個(gè)Python實(shí)現(xiàn)遍歷文件夾并刪除的代碼,主要是給大家分享下這3種方法的實(shí)現(xiàn)思路,有需要的小伙伴可以參考下2016-04-04
利用pyuic5將ui文件轉(zhuǎn)換為py文件的方法
今天小編就為大家分享一篇利用pyuic5將ui文件轉(zhuǎn)換為py文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
對(duì)python opencv 添加文字 cv2.putText 的各參數(shù)介紹
今天小編就為大家分享一篇對(duì)python opencv 添加文字 cv2.putText 的各參數(shù)介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12

