如何在 Django Admin 中将模型重新分配给不同的应用程序以仅显示目的

ali*_*s51 5 django django-admin

我知道我可以使用 Django Admin 更改模型的显示标题

    class Meta:
        verbose_name='Custom Model Name Here'
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法显示模型显示在哪个应用程序标题下?

例如,如果我Users在一个也称为的新应用程序中创建自定义用户模型users,则默认用户模型将从Authentication and Authorization > UsersUsers > Users

我想将其保留在原来的标题下Authentication and Authorization > Users

在此输入图像描述

我已阅读答案,建议更改应用程序verbose_name,但它仅更改与模型关联的应用程序的详细名称。我想在管理面板上的不同组中显示模型。您可以在此处看到该方法遇到的问题:

在此输入图像描述

Hen*_*ryM 9

您可以设置代理模型

在app_1.models.py中

class MyModel(models.Model):
    ...
Run Code Online (Sandbox Code Playgroud)

在app_2.models.py中

from app_1.models import MyModel

class MyModelProxy(MyModel):
    class Meta:
        proxy = True
Run Code Online (Sandbox Code Playgroud)

然后正常在admin中注册MyModelProxy


小智 1

没有简单的方法可以实现您想要的功能,请查看生成视图的 Django 代码/模板:

@never_cache
def index(self, request, extra_context=None):
    """
    Display the main admin index page, which lists all of the installed
    apps that have been registered in this site.
    """
    app_list = self.get_app_list(request)

    context = {
        **self.each_context(request),
        'title': self.index_title,
        'app_list': app_list,
        **(extra_context or {}),
    }

    request.current_app = self.name

    return TemplateResponse(request, self.index_template or 'admin/index.html', context)
Run Code Online (Sandbox Code Playgroud)

templates/admin/index.html:

{% for app in app_list %}
    <div class="app-{{ app.app_label }} module">
    <table>
    <caption>
        <a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a>
    </caption>
    {% for model in app.models %}
        <tr class="model-{{ model.object_name|lower }}">
        {% if model.admin_url %}
            <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
        {% else %}
            <th scope="row">{{ model.name }}</th>
        {% endif %}

        {% if model.add_url %}
            <td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td>
        {% else %}
            <td>&nbsp;</td>
        {% endif %}

        {% if model.admin_url %}
            {% if model.view_only %}
            <td><a href="{{ model.admin_url }}" class="viewlink">{% trans 'View' %}</a></td>
            {% else %}
            <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
            {% endif %}
        {% else %}
            <td>&nbsp;</td>
        {% endif %}
        </tr>
    {% endfor %}
    </table>
    </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Django 管理模板直接循环您的 app_list ,因此唯一的方法是覆盖模板admin/index.html以按照您想要的顺序放置模型。

来自 Django 文档:

对于那些无法以这种方式覆盖的模板,您仍然可以为整个项目覆盖它们。只需将新版本放在 templates/admin 目录中即可。这对于创建自定义 404 和 500 页面特别有用。

https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#overriding-vs-replacing-an-admin-template