python - Django Admin 中是否有“DetailView”?
问题描述
我知道 Django 管理员中有一个更改/更新视图,但是是否有任何详细视图只列出了记录的属性?有点像 Django 应用程序中的 DetailView?
或者有人知道我可以安装任何 3rd 方包以提供相同的功能吗?
解决方案
我最近也在调查这个。
一种可行的方法是使用 detail_view 方法创建一个自定义ModelAdmin
,该方法将调用转发到ModelAdmin
'schangeform_view()
方法。然后这个视图通过覆盖添加到 urls 列表中ModelAdmin.get_urls()
。
然后,在这个方法中设置一个类属性,比如 __detail_view 为 True。然后覆盖has_change_permission()
方法,如果检测到 __detail_view 并将其设置为 True,则返回 False。这将导致 AdminSite 以只读模式(使用 AdminReadonlyField 包装器字段)而不是标准 AdminField 对象呈现字段。
您还可以将 change_form_template 更改为 detail_view 的自定义模板,以适应详细视图的自定义渲染。
class CustomModelAdmin(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
if getattr(self, '__detail_view', None):
return False
return super().has_change_permission(request, obj)
def detail_view(self, request, object_id, form_url='', extra_context=None):
setattr(self, '__detail_view', True)
# Custom template for detail view
org_change_form_template = self.change_form_template
self.change_form_template = self.detail_view_template or self.change_form_template
ret = self.changeform_view(request, object_id, form_url, extra_context)
self.change_form_template = org_change_form_template
delattr(self, '__detail_view')
return ret
def get_urls(self):
urls = super().get_urls()
# add detail-view for the object
from django.urls import path
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
wrapper.model_admin = self
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.model_name
# Replace the backwards compatibility (Django<1.9) change view
# for the detail view.
urls[len(urls)-1] = path('<path:object_id>/', wrap(self.detail_view), name='%s_%s_detail' % info)
return urls
我没有尝试过自定义模板方法,但使用__detail_view
对象属性强制只读渲染似乎可行。
默认的 change_form_template 仍然在底部显示删除按钮,我猜这没关系。但它需要另一个按钮才能真正将您带到可以更改对象的真正更改页面。同样,模板定制是要走的路。提示:如果用户具有更改权限,请查看{% submit_row %}
管理模板并为自定义包含模板标签建模,该标签显示“更改”按钮。请注意在设置属性has_change_permission()
之前调用此处以获得真正的权限。__detail_view
不确定这样做是否还有其他含义,但它应该可以工作。
高温高压
推荐阅读
- sql - 在 SQL 作业上执行 cmdexec 以导出到 CSV 的意外参数
- javascript - 在angularjs应用程序中更改粗体文本
- python - python regex re.sub 删除逗号前的空格
- postgresql - 具有负值的 SPLIT_PART [Postgres 9.5]
- xml - 如何在不删除同级的情况下匹配子级元素进行分组?
- amazon-s3 - 红移卸载问题
- java - java - 如何在SpringBoot的java中为@RequestBody中的每个字段只取一个值
- javascript - 在本地浏览器中按 F5 时,Weinre 如何以及为何刷新客户端浏览器?
- postman - 如何获得特定(高速公路)道路的车道数?
- node.js - 让任务在 59.05 秒后超时 aws lambda nodejs