首页 > 解决方案 > 如何在 Django 自定义视图中显示多个模型的子集,其 UI 与其他模型相同?

问题描述

我在 admin.py 中使用此代码在管理面板中创建了一个自定义视图。我希望 sometemplate.html 模板具有相同 UI 格式的信息,就像我在管理面板中单击另一个模型时一样,并且该信息需要是来自多个模型的行的组合。因此,显示在此自定义视图中的数据将包含来自多个模型的所有条目,有效 = False

如何在我的 Django 管理员自定义视图中做到这一点?

class DummyModelAdmin(admin.ModelAdmin):
    model = DummyModel
    
    def my_custom_view(self,request):
        # return HttpResponse('Admin Custom View')
        context = dict(
            )
        return TemplateResponse(request, "webapp/sometemplate.html", context)

    def get_urls(self):
        view_name = '{}_{}_changelist'.format(
            self.model._meta.app_label, self.model._meta.model_name)
        return [
            path('my_admin_path/', self.my_custom_view, name=view_name),
        ]
admin.site.register(DummyModel, DummyModelAdmin)

sometemplate.html 代码:

{% extends "admin/base_site.html" %}
{% block content %}

{% endblock %}

标签: pythondjangodjango-viewsdjango-templates

解决方案


您可以尝试使用django-polymorphic在其中定义一个通用基础模型,在他们的示例Project中,该模型由模型继承,ArtProject并且ResearchProject基础模型的查询集包含基础模型的实例和从它继承的所有模型。文档中的示例:

>>> Project.objects.all()
[ <Project:         id 1, topic "Department Party">,
 <ArtProject:      id 2, topic "Painting with Tim", artist "T. Turner">,
 <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. >Winter"> ]

它还提供了一些有用的模型管理类来在一个列表视图中显示父模型和子模型。保留了许多 django 管理功能。

如果您不需要任何这些,您最好自己编写视图。Django admin 对于将一些数据快速显示到屏幕上很有用,但是当您尝试绕过默认的做事方式时,它会变得非常复杂。


推荐阅读