首页 > 解决方案 > Django Admin 中是否有“DetailView”?

问题描述

我知道 Django 管理员中有一个更改/更新视图,但是是否有任何详细视图只列出了记录的属性?有点像 Django 应用程序中的 DetailView?

或者有人知道我可以安装任何 3rd 方包以提供相同的功能吗?

标签: pythondjangodjango-admin

解决方案


我最近也在调查这个。

一种可行的方法是使用 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

不确定这样做是否还有其他含义,但它应该可以工作。

高温高压


推荐阅读