我知道Django admin中有一个更改/更新视图,但是是否有任何详细信息视图仅列出记录的属性?有点像Django应用中的DetailView?
或者有人知道我可以安装以提供相同功能的任何第三方软件包吗?
答案 0 :(得分:0)
我最近也在对此进行调查。
一种可行的方法是使用detail_view方法创建自定义protected static void openFile(Context context, Uri localUri){
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setDataAndType(localUri, context.getContentResolver().getType(localUri));
context.startActivity(i);
}
,该方法将调用转发到ModelAdmin
的{{1}}方法。然后,通过覆盖ModelAdmin
将此视图添加到url列表中。
然后,在此方法中设置一个类属性,将__detail_view设置为True。然后重写changeform_view()
方法,如果检测到__detail_view并将其设置为True,则该方法返回False。这将导致AdminSite以只读模式(使用AdminReadonlyField包装器字段)而不是标准AdminField对象呈现字段。
您还可以将change_form_template更改为detail_view的自定义模板,以适应细节视图的自定义呈现。
ModelAdmin.get_urls()
我还没有尝试过自定义模板方法,但是使用has_change_permission()
对象属性来强制进行只读租用似乎很有效。
默认的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
属性之前,请注意在此处调用{% submit_row %}
以获得真正的权限。
不确定这样做是否还有其他含义,但应该可以。
HTH