我有一個名為 Record 的模型,該模型有源代碼資訊。現在,我想在管理站點中添加一個按鈕。當前的 django admin.py 代碼如下:
@admin.register(Record)
class ControlRecord(admin.ModelAdmin):
list_display = ["file_path", "go_to_src_code", "func_info", "line"]
search_fields = ['file_path', 'func_info']
list_filter = ['severity', 'is_misinformation']
actions = [jump_to_src_code]
def go_to_src_code(self, obj):
return format_html(
'<button onclick= "" >Go</button>'
)
go_to_src_code.short_description = "GoToSrcCode"
單擊按鈕后我想指定指定的方法,我該怎么辦?
uj5u.com熱心網友回復:
這取決于下一步的行動。
您想在串列視圖上呼叫 js 函式:
def jump_to_src_code(*args, **kwargs):
print('it works in python')
@admin.register(Record)
class ControlRecord(admin.ModelAdmin):
list_display = ["file_path", "go_to_src_code", "func_info", "line"]
search_fields = ['file_path', 'func_info']
# list_filter = ['severity', 'is_misinformation']
actions = [jump_to_src_code]
class Media:
js = ('myjs.js')
def go_to_src_code(self, obj):
return mark_safe('<button onclick= "alert(\'it works in js\'); // call function from myjs.js" >Go</button>')
go_to_src_code.short_description = "GoToSrcCode"
通過單擊您啟動js:

您想呼叫特殊的管理操作:
def jump_to_src_code(*args, **kwargs):
print('it works in python')
@admin.register(Record)
class ControlRecord(admin.ModelAdmin):
list_display = ["file_path", "go_to_src_code", "func_info", "line"]
search_fields = ['file_path', 'func_info']
# list_filter = ['severity', 'is_misinformation']
actions = [jump_to_src_code]
# class Media:
# js = ('myjs.js')
def go_to_src_code(self, obj):
action_name = 'jump_to_src_code'
action_index_in_action_list = '1'
return mark_safe(f"""
<input type="hidden" name="_selected_action" value="{obj.id}">
<input type="hidden" name="action" value="{action_name}">
<button type="submit" name="index" value="{action_index_in_action_list}">Go</button>"""
)
go_to_src_code.short_description = "GoToSrcCode"
這使您可以在 python 中呼叫您的操作函式。

感謝您的評論:我同意,對于管理員操作呼叫,并非所有示例都適用于之前的示例。我做了一些改進:
def go_to_src_code(self, obj):
action_name = 'jump_to_src_code'
action_index_in_action_list = '1'
return mark_safe(f"""
<label >Go
<input type="checkbox" name="_selected_action" onchange="this.nextElementSibling.disabled=false;this.nextElementSibling.nextElementSibling.disabled=false;this.form.submit()" value="{obj.id}" style="display:none;">
<input type="hidden" disabled name="action" value="{action_name}">
<input type="hidden" disabled name="index" value="{action_index_in_action_list}">
</label>"""
)
為什么我們需要它:
- 動作的輸入(“索引”,“動作”) - 之前應該禁用它們。否則其他操作無效。
- obj.pk ("_selected_action") 的輸入 - 這應該是復選框。否則瀏覽器發送objects.pk 串列。
我不喜歡這種改進,我認為這里應該是帶有重定向的新視圖和帶有“formaction”屬性的按鈕。但它有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/498318.html
