如何在 Django 管理自定义列中获取请求参数?

Posted

技术标签:

【中文标题】如何在 Django 管理自定义列中获取请求参数?【英文标题】:How to get request params in Django admin custom column? 【发布时间】:2019-01-29 23:32:54 【问题描述】:

我需要在Django admin change 页面中保留有关过滤和搜索的信息。

所以当用户按"?away_team__id__exact=267821" 过滤时,我需要将此查询附加到change page url。

假设我们通过上面的查询过滤了对象。这是更改列表的网址:

http://127.0.0.1:8000/matches/match/?away_team__id__exact=267821

我想创建change 列,将用户重定向到当前对象的change 页面,并将查询附加到url,因此:

http://127.0.0.1:8000/matches/match/2009/change/

网址将是:

http://127.0.0.1:8000/matches/match/2009/change/?away_team__id__exact=267821

问题是我无法在自定义列方法中访问请求。我尝试使用模板语言来做,但没有成功,我得到:

http://127.0.0.1:8000/matches/match/1996/change/?%20request.GET.urlencode%20

这是方法:

def change(self,obj):
    return mark_safe(f"""<a class="changelink" href="reverse("admin:matches_match_change",args=(obj.pk,))"""+"? request.GET.urlencode \""+"><span class='icon'>Zmeniť</span></a>")

你知道怎么做吗?

编辑

这是因为我需要在change 对象页面中创建NEXTPREVIOUS 按钮,以便用户可以直接进入下一个对象。

【问题讨论】:

您可以从 request.META['HTTP_REFERER'] 的更改视图本身的更改列表中提取查询字符串,以便处理该信息。 @schwobaseggl 覆盖更改视图是个好主意,我不知道管理员中有 change_view 功能。谢谢 @schwobaseggl 嗯,但是当用户第一次点击 NEXT 按钮时,HTTP_REFERER 将一文不值... 【参考方案1】:

您可以只将当前请求存储在更改列表视图中的管理实例上,以使其可用于后续方法:

class YourAdmin(ModelAdmin):
    def changelist_view(self, request, *args, **kwargs):
        self.request = request
        return super().changelist_view(request, *args, **kwargs)

    def change(self, obj):
        request = getattr(self, 'request', None)
        if request:
           # use request.GET to construct the link

【讨论】:

以上是关于如何在 Django 管理自定义列中获取请求参数?的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中测试自定义管理操作

Django模板从请求或“刷新”单选按钮获取自定义属性

具有父 url 参数的自定义 Django 管理站点

Django admin - 如何获取模板标签中的所有注册模型?

您可以将参数添加到 Django 自定义管理操作吗?

获取高级自定义模板标记中的请求上下文