覆盖 django 管理分页以及 url 参数

Yog*_*ear 5 django django-templates django-models django-admin django-rest-framework

我想为我的管理面板实现自定义分页。

我的网址如下所示: http://localhost:8000/admin/items/?group_id=20

group_id在此 URL 上,我做了一些工作来使用参数(通过覆盖方法)过滤结果get_changelist

页面结果是正确的,问题是我的分页结果是这样的http://localhost:8000/admin/items/?p=1,而我希望 URL 是这样的http://localhost:8000/admin/items/?group_id=20&p=1并保留参数。

基本上我想要与How to paginate Django with other getvariables?相同的结果。但使用 Django 管理。

如何将参数与分页一起保留?

我尝试过覆盖 pagination.html 文件,但没有成功。

谢谢。

编辑

我尝试过覆盖 pagination.html 但request.GET.items仍然是空的(即使我的设置文件配置良好)

{% load admin_list %}
{% load i18n %}
{% load content_extras %}
<p class="paginator">
{% if pagination_required %}
    {% for i in page_range %}
        <a href="?p={{ i }}{% for key, value in request.GET.items %}{% if key != 'p' %}&{{ key }}={{ value }}{% endif %}{% endfor %}">{{ i }}</a>
    {% endfor %}
{% endif %}
{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %}
{% if show_all_url %}<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %}
{% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% trans 'Save' %}">{% endif %}
</p>
Run Code Online (Sandbox Code Playgroud)

Yog*_*ear 3

找到了解决方案:

1/ 覆盖changelist_viewadmin.py传递额外数据

def changelist_view(self, request, extra_context=""):
    response = super(ItemAdmin, self).changelist_view(request, extra_context)

    group_id = request.GET.get('group_id', None)

    if group_id:
        extra_context = {
            'group_id': group_id,
        }
        response.context_data.update(extra_context)

    return TemplateResponse(request, "admin/changelist.html", response.context_data)
Run Code Online (Sandbox Code Playgroud)

2/changelist.html基于django管理模板创建文件(复制/粘贴)

添加{% load content_extras %}到文件顶部(第 3 行)

更改{% block pagination %}{% pagination cl %}{% endblock %}线路{% block pagination %}{% custom_pagination cl %}{% endblock %}

content_extras.py3/在文件夹下创建templatetags并写入custom_pagination函数

from django import template
from django.contrib.admin.templatetags import admin_list

register = template.Library()


@register.inclusion_tag('admin/pagination.html', takes_context=True)
def custom_pagination(context, cl):
    pagination = admin_list.pagination(cl)
    if 'group_id' in context:
        params = (('group_id', context['group_id']),)
        pagination['params'] = params
    return pagination
Run Code Online (Sandbox Code Playgroud)

4/ 创建pagination.html(与 相同的位置changelist.html

{% load admin_list %}
{% load i18n %}
{% load content_extras %}
<p class="paginator">
{% if pagination_required %}
    {% for i in page_range %}
        <a href="?p={{ i }}{% for key, value in params %}{% if key != 'p' %}&{{ key }}={{ value }}{% endif %}{% endfor %}">{{ i }}</a>
    {% endfor %}
{% endif %}
{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %}
{% if show_all_url %}<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %}
{% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% trans 'Save' %}">{% endif %}
</p>
Run Code Online (Sandbox Code Playgroud)