django admin 根據choice欄位選擇的不同來顯示不同的頁面方式
阿新 • • 發佈:2020-05-14
我就廢話不多說了,大家還是直接看程式碼吧!
一、舉例
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','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>
整體樣圖
以上這篇django admin 根據choice欄位選擇的不同來顯示不同的頁面方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。