最初的回答:我知道在Django admin中有一个更改/更新视图,但是否有任何详细视图仅列出记录的属性?类似于Django应用程序中的DetailView?
还是有人知道可以安装哪些第三方软件包来提供相同的功能吗?
还是有人知道可以安装哪些第三方软件包来提供相同的功能吗?
我最近也在调查这个问题。
一个可行的方法是创建一个自定义的ModelAdmin
,其中包含一个detail_view
方法,该方法将调用ModelAdmin
的changeform_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()
来获取真实的权限。
不确定这种方式是否还有其他影响,但应该可以工作。
希望对你有所帮助。