本教程之后,我一直在自定义Django
的change_list.html
。我的问题涉及该教程中未介绍的内容:
如何轻松添加checkbox
和actions
(删除选定的项目)?
我在admin部分的templatetags
中查看(主要是在此处,但我不明白如何在自定义的change_list.html
模板中轻松地将删除操作添加到每个项目中,以及应添加的内容以及ModelAdmin
类中的内容)。
更新:
以下是自定义change_list.html
,我正在尝试将" poced"复选框添加到:
{% extends "admin/change_list.html" %}
{% block content_title %}
<h1>Title</h1>
{% endblock %}
{% block result_list %}
<div class="results">
<table id="result_list">
<thead>
...
</thead>
<tbody>
{% for item in items %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
关键是查看在" sale_summary_change_list.html"中扩展的" admin/change_list.html"模板。它的result_list块具有所需的形式。您还必须将输入复选框添加到admin.py/changelist_view中的返回查询集。我修改了教程中的代码。如果我们想能够删除单个项目,我们当然必须放弃销售的汇总。
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
这是模板:
{% 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> {{ row.check_box }} </td>
<td> {{ row.category__name }} </td>
<td> {{ row.amount | intcomma }} </td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
{% block pagination %}{% endblock %}
检查GitHub上的完整项目:
https://github.com/sabirakhadov/django-action-action-change-list-demo
他使用map
将复选框附加到结果列表的部分可能会在您处理这么多行时会出现一些性能问题,请说1000行
我发现:您可以在前端渲染复选框,并将其传递给元素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 %}