添加一个`next` url到django admin更改链接

mem*_*elf 4 django django-admin

在我的django项目中,我创建了一个指向管理界面的链接,以便用户可以编辑该对象:

<a href="{% url admin:mode_change object.id %}">modify object</a>
Run Code Online (Sandbox Code Playgroud)

这工作正常,但在用户完成管理界面中的对象编辑后,我希望自动将用户带回原始URL(或其他一些URL).目前,在用户修改对象之后,她/他最终在管理界面中查看所有model条目.

有没有办法为管理员链接提供返回URL?

mem*_*elf 7

这似乎工作:

admin.py:
class ModelAdmin(admin.ModelAdmin):
    form = ModelForm

    def response_change(self, request, obj):
        res = super(ModelAdmin, self).response_change(request, obj)
        if "next" in request.GET:
            return HttpResponseRedirect(request.GET['next'])
        else:
            return res
Run Code Online (Sandbox Code Playgroud)

并在模板中(其中currentUrl是视图中生成的变量):

<a href="{% url admin:mode_change object.id %}?next={{ currentUrl }}">modify object</a>
Run Code Online (Sandbox Code Playgroud)

  • 这使您可以打开Open Redirect攻击.https://www.owasp.org/index.php/Open_redirect.使用django.utils.http.is_safe_url.此外,在模板中,您可以执行{{request.get_full_path | urlencode}}而不是{{currentUrl}}.此外,即使保存不成功,这也会进行重定向 (2认同)

小智 5

对于这个问题,方法“response_post_save_change”会更好,因为它仅在成功保存后调用。在 Django 3.1 上,这对我有用:

def response_post_save_change(self, request, obj):
    res = super().response_post_save_change(request, obj)
    if "next" in request.GET:
        return HttpResponseRedirect(reverse(...))
    else:
        return res
Run Code Online (Sandbox Code Playgroud)