django admin 根據(jù)choice字段選擇的不同來(lái)顯示不同的頁(yè)面方式
我就廢話不多說(shuō)了,大家還是直接看代碼吧!
一、舉例
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)限不同,訪問(wè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)限信息
# 通過(guò)自定義 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("無(wú)權(quán)訪問(wè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ì)到傳值的問(wèn)題,于是我們產(chǎn)生了自定過(guò)濾器。
首先自定過(guò)濾器
# 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): """ 自定義過(guò)濾器 :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字段選擇的不同來(lái)顯示不同的頁(yè)面方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用Python操作MongoDB數(shù)據(jù)庫(kù)的詳細(xì)指南
MongoDB是由C++語(yǔ)言編寫的非關(guān)系型數(shù)據(jù)庫(kù),是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng),其內(nèi)容存儲(chǔ)形式類似JSON對(duì)象,下面這篇文章主要給大家介紹了關(guān)于利用Python操作MongoDB數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-06-06python用700行代碼實(shí)現(xiàn)http客戶端
這篇文章主要介紹了python用700行代碼實(shí)現(xiàn)http客戶端的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異)
這篇文章主要介紹了matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02解決TypeError: Object of type xxx is&
這篇文章主要介紹了解決TypeError: Object of type xxx is not JSON serializable錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法總結(jié)
在Python?中創(chuàng)建虛擬環(huán)境非常容易,但是刪除虛擬環(huán)境可能會(huì)有一些挑戰(zhàn),這篇文章主要給大家介紹了關(guān)于python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法,需要的朋友可以參考下2024-03-03Python面向?qū)ο蠡A(chǔ)入門之編碼細(xì)節(jié)與注意事項(xiàng)
這篇文章主要給大家介紹了關(guān)于Python面向?qū)ο蠡A(chǔ)入門之編碼細(xì)節(jié)與注意事項(xiàng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量
這篇文章主要介紹了keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03