我已经按照tutorial自定义了Django
change_list.html
。我的问题涉及该教程中没有涉及的内容:
如何轻松添加checkbox
和actions
(删除所选项目)?
我查看了管理部分的templatetags
(主要是here,但我无法理解如何轻松地将删除操作添加到自定义{{1}中的每个项目中模板以及应该添加到change_list.html
类的内容。)
更新
以下是自定义ModelAdmin
,我试图将项目复选框添加到:
change_list.html
答案 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 %}