Django 管理后台内联更改列表

7 投票
2 回答
3105 浏览
提问于 2025-04-15 13:39

我可以使用 TabularInline 和 StackedInline 这两个类来编辑父子关系,不过我更希望能把子关系列成一个变更列表,因为信息量太大,表单也太复杂了。请问在 Django 管理后台有没有现成的内联变更列表,或者有没有办法自己创建一个?

2 个回答

0

其实我用了一些小技巧成功实现了这个功能。Django的管理后台需要一些更新,而InlineAnything就是其中之一。

下载库: https://github.com/smartlgt/django-fakeinline

class MyInlineTest(FakeInline):
  def __init__(self, parent_model, admin_site):
    super().__init__(parent_model, admin_site)
    self.template = Template('')
    self.admin_site = admin_site
    
  def get_fields(self, request, obj=None):
    dpaa = DisplayProductAccessAdmin(DisplayProductAccess, self.admin_site)
    dpaa.change_list_template = 'test.html'
    self.template = Template(dpaa.changelist_view(request, {}).rendered_content)
    return FakeInline.get_fields(self, request, obj=obj)

然后在你的test.html文件中,复制Django的change_list.html大部分内容。因为我们使用的是Jazzmin,所以就用这个吧。

    {% load i18n admin_urls static admin_list jazzmin %}

{% block extrastyle %}
    <link rel="stylesheet" href="{% static 'vendor/select2/css/select2.min.css' %}">

    {% if cl.formset or action_form %}
        <script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
    {% endif %}
    {{ media.css }}
    {% if not actions_on_top and not actions_on_bottom %}
        <style>
            #changelist table thead th:first-child {width: inherit}
        </style>
    {% endif %}
{% endblock %}

{% block extrahead %}
    {{ media.js }}
{% endblock %}

{% block content %}
    <div class="col-12">
        <div class="card card-primary card-outline">
            <div class="card-header">
                <h4 class="card-title">{{ title }}{% block pretitle %}{% endblock %}</h4>
                <div class="card-tools form-inline">
                    {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %}
                    {% block search %}
                        {% search_form cl %}
                    {% endblock %}
                </div>
            </div>

            <div class="card-body">
                <form id="changelist-form" method="post"{% if cl.formset and cl.formset.is_multipart %}enctype="multipart/form-data"{% endif %} novalidate>{% csrf_token %}
                    <div id="content-main">
                        {% if cl.formset and cl.formset.errors %}
                        <p class="errornote">
                            {% if cl.formset.total_error_count == 1 %}
                                {% trans "Please correct the error below." %}
                            {% else %}
                                {% trans "Please correct the errors below." %}
                            {% endif %}
                        </p>
                        {{ cl.formset.non_form_errors }}
                        {% endif %}
                        <div class="module{% if cl.has_filters %} filtered{% endif %}" id="changelist">
                        <div class="row">
                            <div class="col-12">
                                {% if cl.formset %}
                                    <div>{{ cl.formset.management_form }}</div>
                                {% endif %}

                                {% block result_list %}
                                    <div class="row">
                                        <div class="col-12 col-sm-8">
                                            {% if action_form and actions_on_top and cl.show_admin_actions %}
                                                {% admin_actions %}
                                            {% endif %}
                                        </div>
                                        <div class="col-12 col-sm-4">
                                            {% block object-tools %}
                                                {% block object-tools-items %}
                                                    {% change_list_object_tools %}
                                                {% endblock %}
                                            {% endblock %}
                                        </div>
                                    </div>
                                    <hr/>
                                    {% result_list cl %}
                                    {% if action_form and actions_on_bottom and cl.show_admin_actions %}
                                        <div class="row">
                                            <div class="col-12">
                                                {% admin_actions %}
                                            </div>
                                        </div>
                                    {% endif %}
                                {% endblock %}
                            </div>
                        </div>
                        <div class="row">
                            {% block pagination %}{% pagination cl %}{% endblock %}
                        </div>
                    </div>
                    </div>
                </form>
            </div>

        </div>
        <br class="clear"/>
    </div>
{% endblock %}

{% block extrajs %}
    <script type="text/javascript" src="{% static 'vendor/select2/js/select2.min.js' %}"></script>
    <script type="text/javascript" src="{% static 'jazzmin/js/change_list.js' %}"></script>
{% endblock %}

在这里输入图片描述

3

这个功能系统里没有,不过我觉得自己做一个AdminInline的子类(还有一个配套的模板)应该不难。你可以参考TabularInline的做法,但直接显示字段的数据,而不是显示表单字段。

撰写回答