Django Admin 中是否有“DetailView”?

3
最初的回答:我知道在Django admin中有一个更改/更新视图,但是否有任何详细视图仅列出记录的属性?类似于Django应用程序中的DetailView?
还是有人知道可以安装哪些第三方软件包来提供相同的功能吗?

你可以从https://medium.com/@adriennedomingus/adding-custom-views-or-templates-to-django-admin-740640cc6d42上查看。 - Pallavi Sharma
1
您可以将字段设置为只读,或者仅授予用户查看权限。 - HenryM
@HenryM,我仍然希望用户能够访问更改视图。但是我想要另一个视图,用户可以在其中查看有关记录的更多信息。例如,如果一个表有12列,在列表视图中显示所有列会很奇怪。如果有一个详细视图,信息(包括相关记录)可以轻松地在那里显示出来。 - Sigma B.
@PallaviSharma,谢谢您。我知道我可以创建自定义视图。只是没有专门的详细视图,让我感到很奇怪,而且我也找不到第三方模块。这让我觉得好像我错过了什么。 - Sigma B.
1个回答

0

我最近也在调查这个问题。

一个可行的方法是创建一个自定义的ModelAdmin,其中包含一个detail_view方法,该方法将调用ModelAdminchangeform_view()方法。然后,通过重写ModelAdmin.get_urls()将此视图添加到urls列表中。

然后,在这个方法中设置一个类属性,比如说__detail_view为True。然后重写has_change_permission()方法,如果检测到__detail_view为True,则返回False。这将导致AdminSite以只读模式渲染字段(使用AdminReadonlyField包装字段),而不是标准的AdminField对象。

您还可以将change_form_template更改为用于详细视图的自定义模板,以适应详细视图的自定义渲染。

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仍然在底部显示删除按钮,这应该是可以接受的。但是它需要另一个按钮来实际进入真正的修改页面,从而对对象进行更改。再次进行模板定制是解决这个问题的方法。提示:查看admin模板中的{% submit_row %}并建立一个自定义包含模板标签,根据用户是否具有修改权限来显示Change按钮。请注意,在设置__detail_view属性之前调用has_change_permission()来获取真实的权限。

不确定这种方式是否还有其他影响,但应该可以工作。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接