精品久久久久久久久水蜜桃|丁香花五月|新中文字幕麻豆视频|美女下面粉嫩粉嫩冒白浆高清|日本黄h兄妹h动漫一区二区三区|床片激情免费视频|羞羞动漫在线入口免费阅读

python django 快速入門

django 框架配有一個功能強大的管理站點 , 里面已經預定義了許多管理站點需要進行的操作,但是有時可能默認的操作不能滿足需求,如需要批量更新選中的對象,這需要編寫自定義 action 實現 。本文基于 django 官方英文文檔梳理了一下自定義管理操作需要做的工作,方便快速了解自定義管理操作的實現過程 。

python django 快速入門

文章插圖
python django 快速入門

文章插圖
Admin actions 簡介admin actions 是一些在 admin 站點下拉列表中可以選擇執行的簡單函數,比如刪除一個對象操作 。
python django 快速入門

文章插圖
python django 快速入門

文章插圖
編寫 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"

python django 快速入門

文章插圖
添加 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)
效果如下:
python django 快速入門

文章插圖
python django 快速入門

文章插圖
處理 action 中的錯誤如果在自定義的 actions 中可能發生錯誤,需要捕獲這些錯誤并調用 django.contrib.admin.ModelAdmin.message_user 來向用戶顯示錯誤消息 。
python django 快速入門

文章插圖
將 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 站點的行為相匹配 。
效果如下:
python django 快速入門

文章插圖
python django 快速入門

文章插圖
提供中間頁的 action在一些情況下,action 需要提供一個中間頁來提示用戶是否確認執行操作,比如刪除對象時提醒用戶是否確認執行操作:
python django 快速入門

文章插圖
要提供中間頁,只需要返回一個 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", queryset, stream=response)
return response
但是這樣可能會使 action 的邏輯非常復雜,推薦做法是返回一個 HTTP 重定向 , 重定向到一個新的頁面上,這樣可以在頁面的視圖中執行更復雜的邏輯,避免 action 中充滿復雜的邏輯 。
from django.contrib import admin
fromdjango.contrib.contenttypes.models import ContentType
from django.http import HttpResponseRedirect
defexport_selected_objects(modeladmin, request, queryset):
selected =request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
ct = ContentType.objects.get_for_model(queryset.model)
return HttpResponseRedirect("/export/?ct=%s&ids=%s"% (ct.pk, ",".join(selected)))

python django 快速入門

文章插圖
讓 actions 在整個站點中都有效如果想要讓上述中的導出操作在整個管理站點中都能使用,可以這樣做:
from django.contrib import admin
admin.site.a
python django 快速入門

文章插圖
禁用 action禁用站點范圍作用的的 action:
admin.site.disable_action('delete_selected')
這將在整個管理站點范圍內禁用該 action 。
如果需要復用已經禁用的 action 。只需要在相應的 ModelAdmin 的actions 屬性中添加這個 action即可 。例如復用上述禁用的 action:
# This one will
classAnotherModelAdmin(admin.ModelAdmin):
actiOns= ['delete_selected']
在某個 ModelAdmin 中禁用所有的 action,只需要將 action 屬性設置為None 即可 。
class MyModelAdmin(admin.ModelAdmin):
actiOns=None

python django 快速入門

文章插圖
有條件的啟用或者禁用 action通過重寫 ModelAdmin的get_actions 方法可以實現有條件的啟用或者禁用 action 。該方法返回一個允許使用的 actions 字典,鍵是操作名稱,值是(函數、名稱、short_description)元組 。例如,如果您只希望名稱以“J”開頭的用戶能夠批量刪除對象:
class MyModelAdmin(admin.ModelAdmin):
...
def get_actions(self, request):
actiOns=super.get_actions(request)
if request.user.username[0].upper !='J':
if'delete_selected'in actions:
del actions['delete_selected']
return actions

python django 快速入門

文章插圖
設置 action 的權限action 可以通過設置 allowed_permissions 屬性來限制具有特定權限的用戶的可用性:
efmake_published(modeladmin, request, queryset):
queryset.update(status='p')
make_published.allowed_permissiOns= ('change',)
如果 allowed_permissions 具有多個權限,則只要用戶通過至少一個權限檢查,該操作就可用 。allowed_permissions 可用值為:
【python django 快速入門】? a
python django 快速入門

文章插圖