添加复选框并删除自定义Django admin change_list的操作

时间:2017-08-30 23:46:22

标签: python django django-admin

我已经按照tutorial自定义了Django change_list.html。我的问题涉及该教程中没有涉及的内容:

如何轻松添加checkboxactions(删除所选项目)?

我查看了管理部分的templatetags(主要是here,但我无法理解如何轻松地将删除操作添加到自定义{{1}中的每个项目中模板以及应该添加到change_list.html类的内容。)

更新

以下是自定义ModelAdmin,我试图将项目复选框添加到:

change_list.html

2 个答案:

答案 0 :(得分:2)

关键是要看" admin / change_list.html"在" sale_summary_change_list.html"中扩展的模板。其result_list块具有所需的形式。您还必须在admin.py/changelist_view中将输入复选框添加到返回的查询集中。我修改了教程中的代码。如果我们想要删除单个项目,我们当然必须放弃销售汇总。

$('#landing').waypoint(function(direction) {
  if (direction === 'down') {
    $('nav a').removeClass('active-nav');
    $('#b1').addClass('active-nav');
  }
}, {
  offset: '25%'
});

$('#landing').waypoint(function(direction) {
  if (direction === 'up') {
    $('nav a').removeClass('active-nav');
    $('#b1').addClass('active-nav');
  }
}, {
  offset: '-25%'
});

这是模板:

from django.contrib import admin
from django.contrib.admin import ModelAdmin, helpers

from .models import SaleSummary, Category


@admin.register(SaleSummary)
class SaleSummaryAdmin(ModelAdmin):
    change_list_template = 'admin/sale_summary_change_list.html'
    date_hierarchy = 'date'

    def changelist_view(self, request, extra_context=None):
        response = super(SaleSummaryAdmin, self).changelist_view(
            request,
            extra_context=extra_context,
        )
        try:
            qs = response.context_data['cl'].queryset
        except (AttributeError, KeyError):
            return response

        # metrics = {
        #     'total': Count('id'),
        #     'total_sales': Sum('amount'),
        # }
        result_qs = list(qs.values('category__name', 'pk', 'amount').order_by('category__name').all())
        map(lambda r: r.update(
            {'check_box': helpers.checkbox.render(helpers.ACTION_CHECKBOX_NAME, r['pk'])}), result_qs)
        response.context_data['summary'] = list(result_qs)

        return response

检查github上的完整项目:

https://github.com/SabirAkhadov/django-action-change-list-demo

答案 1 :(得分:0)

@Sabir答案是最好的答案,而这个答案是基于它的。

当您处理这么多行(比如说1000行)时,他使用map将复选框附加到结果列表的部分可能会带来一些性能问题。

我发现: 您可以在前端渲染复选框,并将其传递给pk元素。

您可以保留相同的管理类,但是在change_list_view函数中删除map行,并让前端进入作业。

所以我这样更改了模板

{% extends "admin/change_list.html" %}
{% load humanize admin_list%}
{% block content_title %}
    <h1> Sales Summary </h1>
{% endblock %}

{% block result_list %}

          {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
          {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
    <div class="results">
        <table>
            <thead>
            <tr>
                <th>
                    <div class="text">
                        <a href="#">Action</a>
                    </div>
                </th>
                <th>
                    <div class="text">
                        <a href="#">Category</a>
                    </div>
                </th>
                <th>
                    <div class="text">
                        <a href="#">Total Sales</a>
                    </div>
                </th>
            </tr>
            </thead>
            <tbody>
            {% for row in summary %}
                <tr class="{% cycle 'row1' 'row2' %}">
                    <td> <td> <input type="checkbox" name="_selected_action" value={{row.pk}} class="action-select"> </td> </td>
                    <td> {{ row.category__name }} </td>
                    <td> {{ row.amount | intcomma }} </td>

                </tr>
            {% endfor %}
            </tbody>

        </table>
    </div>

{% endblock %}

{% block pagination %}{% endblock %}