ibd文件如何变为json_如何轻松了解 Python 必学的 django 框架?
django 框架配有一個功能強大的管理站點,里面已經預定義了許多管理站點需要進行的操作,但是有時可能默認的操作不能滿足需求,如需要批量更新選中的對象,這需要編寫自定義 action 實現。本文基于 django 官方英文文檔梳理了一下自定義管理操作需要做的工作,方便快速了解自定義管理操作的實現過程。
作者 | 單雨,責編 | 黃浩然
出品 | CSDN(ID:CSDNnews)
Admin actions 簡介
admin actions 是一些在 admin 站點下拉列表中可以選擇執行的簡單函數,比如刪除一個對象操作。
編寫 Admin actions
下面舉例說明如何編寫Admin action。例如批量更新一個名為 Article 的模型:
from django.db import models
STATUS_CHOICES = [
('d', 'Draft'),
('p', 'Published'),
('w', 'Withdrawn'),
]
classArticle(models.Model):
title = models.CharField(max_length=100)
body = models.TextField
status = models.CharField(max_length=1,choices=STATUS_CHOICES)
def__str__(self):
returnself.title
下面來編寫 action 函數,這個函數接受三個函數:
? 當前的 ModelAdmin
? 一個代表當前 HTTP 請求的 HttpRequest 對象
? 一個包含用戶選定的對象的 QuerySet (數據庫檢索對象)。
def make_published(modeladmin, request,queryset):
queryset.update(status='p')
為了達到最佳性能,推薦使用 QuerySet 的 update 方法,
for obj in queryset:
do_something_with(obj)
默認情況下,該操作將以“ Make published ”的形式出現在操作列表中,就是函數名,下劃線將由空格替換。為了讓這個方法更容易被人了解,我們可以給它添加一個 short_description 屬性。
def make_published(modeladmin, request,queryset):
queryset.update(status='p')
make_published.short_description ="Markselected stories as published"
添加 action 到 ModelAdmin
完整程序如下:
from django.contrib import admin
from myapp.models import Article
defmake_published(modeladmin, request, queryset):
queryset.update(status='p')
make_published.short_description ="Markselected stories as published"
classArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'status']
ordering = ['title']
actions = [make_published]
admin.site.register(Article, ArticleAdmin)
效果如下:
處理 action 中的錯誤
如果在自定義的 actions 中可能發生錯誤,需要捕獲這些錯誤并調用 django.contrib.admin.ModelAdmin.message_user 來向用戶顯示錯誤消息。
將 action 定義為 ModelAdmin 的內部方法
上述定義的 action 存在一個不足之處就是它和 Article 對象緊密耦合,這會導致大量的重復代碼出現,即使這些 action 的功能都相同。將 action 定義為 ModelAdmin 的方法可以避免出現這個問題。
修改上述 ArticleAdmin:
class ArticleAdmin(admin.ModelAdmin):
...
actions = ['make_published']
def make_published(self, request, queryset):
queryset.update(status='p')
make_published.short_description ="Mark selected stories aspublished"
注意 make_published 變為 ArticleAdmin 的內部方法,第一個參數變為了 self。將 action 變為 ModelAdmin 的方法,使得它可以調用任何admin 提供的方法。例如向用戶發送消息:
class ArticleAdmin(admin.ModelAdmin):
...
def make_published(self, request, queryset):
rows_updated = queryset.update(status='p')
if rows_updated ==1:
message_bit ="1 story was"
else:
message_bit ="%s stories were"%rows_updated
self.message_user(request, "%s successfully marked as published."%message_bit)
這使得 action 執行成功之后自動將 action 的行為和 admin 站點的行為相匹配。
效果如下:
提供中間頁的 action
在一些情況下,action 需要提供一個中間頁來提示用戶是否確認執行操作,比如刪除對象時提醒用戶是否確認執行操作:
要提供中間頁,只需要返回一個 HttpResponse 或者子類即可。例如一個導出選中對象 json 文件的操作:
from django.core import serializers
from django.http import HttpResponse
defexport_as_json(modeladmin, request, queryset):
response = HttpResponse(content_type="application/json")
serializers.serialize("json
總結
以上是生活随笔為你收集整理的ibd文件如何变为json_如何轻松了解 Python 必学的 django 框架?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友服务器系统版本低,客户端版本低于服务
- 下一篇: grouplens上的movielens