ibd文件如何变为json_如何轻松了解 Python 必学的 django 框架?
django 框架配有一個功能強大的管理站點,里面已經(jīng)預(yù)定義了許多管理站點需要進行的操作,但是有時可能默認的操作不能滿足需求,如需要批量更新選中的對象,這需要編寫自定義 action 實現(xiàn)。本文基于 django 官方英文文檔梳理了一下自定義管理操作需要做的工作,方便快速了解自定義管理操作的實現(xiàn)過程。
作者 | 單雨,責(zé)編 | 黃浩然
出品 | CSDN(ID:CSDNnews)
Admin actions 簡介
admin actions 是一些在 admin 站點下拉列表中可以選擇執(zhí)行的簡單函數(shù),比如刪除一個對象操作。
編寫 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 函數(shù),這個函數(shù)接受三個函數(shù):
? 當(dāng)前的 ModelAdmin
? 一個代表當(dāng)前 HTTP 請求的 HttpRequest 對象
? 一個包含用戶選定的對象的 QuerySet (數(shù)據(jù)庫檢索對象)。
def make_published(modeladmin, request,queryset):
queryset.update(status='p')
為了達到最佳性能,推薦使用 QuerySet 的 update 方法,
for obj in queryset:
do_something_with(obj)
默認情況下,該操作將以“ Make published ”的形式出現(xiàn)在操作列表中,就是函數(shù)名,下劃線將由空格替換。為了讓這個方法更容易被人了解,我們可以給它添加一個 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 中可能發(fā)生錯誤,需要捕獲這些錯誤并調(diào)用 django.contrib.admin.ModelAdmin.message_user 來向用戶顯示錯誤消息。
將 action 定義為 ModelAdmin 的內(nèi)部方法
上述定義的 action 存在一個不足之處就是它和 Article 對象緊密耦合,這會導(dǎo)致大量的重復(fù)代碼出現(xiàn),即使這些 action 的功能都相同。將 action 定義為 ModelAdmin 的方法可以避免出現(xiàn)這個問題。
修改上述 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 變?yōu)?ArticleAdmin 的內(nèi)部方法,第一個參數(shù)變?yōu)榱?self。將 action 變?yōu)?ModelAdmin 的方法,使得它可以調(diào)用任何admin 提供的方法。例如向用戶發(fā)送消息:
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 執(zhí)行成功之后自動將 action 的行為和 admin 站點的行為相匹配。
效果如下:
提供中間頁的 action
在一些情況下,action 需要提供一個中間頁來提示用戶是否確認執(zhí)行操作,比如刪除對象時提醒用戶是否確認執(zhí)行操作:
要提供中間頁,只需要返回一個 HttpResponse 或者子類即可。例如一個導(dǎo)出選中對象 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
總結(jié)
以上是生活随笔為你收集整理的ibd文件如何变为json_如何轻松了解 Python 必学的 django 框架?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友服务器系统版本低,客户端版本低于服务
- 下一篇: do还是doing imagine加to