Django框架中的後台管理系統技巧(第二部分)
在上一篇文章中,我們介紹了一些Django框架後台管理系統的技巧,例如如何自訂後台頁面佈局、如何自訂過濾器、如何自訂action等。這篇文章將繼續介紹更多實用的技巧,幫助您更好地使用Django框架。
在Django Model中,ForeignKey是非常實用的一個欄位類型。然而,當我們在建立一個新的Model實例時,ForeignKey類型的欄位需要指定一個相關Model的實例才能保存成功。如果沒有指定,預設會儲存NULL值。而有些情況下,我們可能希望ForeignKey類型的欄位保存在一個預設的關聯實例中,這時候就可以使用Django的get_or_create方法。
例如,我們有一個Product Model,並為其定義一個ProductCategory ForeignKey字段,我們希望當我們創建一個新的Product實例時,自動關聯一個預設的Category實例,可以在Model中加入以下程式碼:
class Product(models.Model): name = models.CharField(max_length=100) category = models.ForeignKey(ProductCategory, default=get_default_category) def get_default_category(): """ 返回默认的ProductCategory实例或者创建一个新的实例 """ category, _ = ProductCategory.objects.get_or_create(name='Default Category') return category
這樣,當我們建立一個新的Product實例時,預設就會自動關聯一個名為"Default Category"的ProductCategory實例。
#有些情況下,我們可能會想要一個Model只能建立一個實例,例如網站中的全域設定。這時候可以使用Django的SingletonModel函式庫,它提供了一個BaseSingletonModel,讓我們可以輕鬆地將任何Model轉換為Singleton Model。
例如,我們有一個GlobalSettings Model,希望它只能建立一個實例,可以這樣定義:
from singleton_models.models import SingletonModel class GlobalSettings(SingletonModel): site_name = models.CharField(max_length=100, default='') site_url = models.URLField(default='') # 其他全局设置字段
定義好了以後,在後台管理系統中,我們只能建立和編輯一個GlobalSettings實例。
在Django框架中,中間件是一個用來處理請求和回應的攔截器。它可以在請求到達視圖函數之前、視圖函數處理請求之後和回應傳送給客戶端之前對請求或回應進行處理。其中,在後台管理系統中新增自訂中間件,可以讓我們輕鬆地對管理員的操作進行攔截和處理。
例如,我們希望在管理員進行某些修改操作時,需要輸入二次確認密碼,可以在Django專案的settings.py檔案中加入以下程式碼:
MIDDLEWARE = [ # 默认的中间件 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 自定义中间件 'myapp.middleware.ConfirmPasswordMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] CONFIRMED_ACTIONS = ( 'myapp.views.EditProductView', 'myapp.views.DeleteProductView', ) class ConfirmPasswordMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 根据请求的URL判断是哪个视图函数,如果是CONFIRMED_ACTIONS中的视图函数,需要做二次确认 view_func = resolve(request.path_info).func if view_func and view_func.__module__ + "." + view_func.__name__ in CONFIRMED_ACTIONS: if not request.session.get('password_confirmed', False): # 没有输入二次确认密码,跳转到输入页面 return redirect(reverse('confirm-password')) response = self.get_response(request) return response
以上程式碼中,我們定義了一個ConfirmPasswordMiddleware,它會在請求到達視圖函數之前對請求進行攔截並判斷是否需要輸入二次確認密碼。 CONFIRMED_ACTIONS是一個需要進行二次確認的視圖函數列表,我們可以根據需要進行新增或刪除。在視圖函數中,我們可以透過request.session.get('password_confirmed', False)查詢目前使用者是否已經輸入了二次確認密碼。
在Django框架中,Serializer是一個用於將Model轉換為字典或JSON格式的類別。在後台管理系統中加入序列化器,可以讓我們輕鬆地將Model轉換為JSON格式並輸出。
例如,我們有一個Product Model,希望將它轉換為JSON格式,並在後台管理系統中輸出,可以這樣定義:
from django.contrib import admin from django.core.serializers import serialize from django.http import HttpResponse class ProductAdmin(admin.ModelAdmin): # 列表视图显示的字段列表 list_display = ('name', 'price', 'category') # 自定义action函数 def export_as_json(self, request, queryset): response = HttpResponse(content_type="application/json") serializers.serialize("json", queryset, stream=response) return response export_as_json.short_description = "导出为JSON" # 自定义函数按钮 change_list_template = 'admin/myapp/product/list.html' def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.my_view), ] return my_urls + urls def my_view(self, request): data = serialize('json', Product.objects.all()) return JsonResponse(data, safe=False) admin.site.register(Product, ProductAdmin)
在以上程式碼中,我們為ProductAdmin添加了一個export_as_json函數,它可以將目前選取的Model實例轉換為JSON格式並輸出給客戶端。同時,我們也為ProductAdmin新增了一個my_view函數,它可以直接查詢所有的Model實例並將它們轉換為JSON格式輸出。
總結
Django框架的後台管理系統是開發網路應用程式的重要工具,它提供了許多現成的功能,可以讓我們輕鬆地管理Model實例,批量修改和刪除。在本篇文章中,我們介紹了一些Django框架後台管理系統的實用技巧,包括如何處理Model中ForeignKey的預設值、如何限制後台管理系統中一個Model只能建立一個實例、如何為後台管理系統添加自定義中間件、如何為背景管理系統的Model新增序列化器。透過這些技巧的使用,可以讓我們更好地使用Django框架的後台管理系統。
以上是Django框架中的後台管理系統技巧(第二部分)的詳細內容。更多資訊請關注PHP中文網其他相關文章!