【问题标题】:adding a `next` url to django admin change link向 django 管理员更改链接添加“下一个”网址
【发布时间】:2012-09-05 11:05:54
【问题描述】:

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

<a href="{% url admin:mode_change object.id %}">modify object</a>

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

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

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    这似乎有效:

    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
    

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

    <a href="{% url admin:mode_change object.id %}?next={{ currentUrl }}">modify object</a>
    

    【讨论】:

    • 这会让您面临开放重定向攻击。 owasp.org/index.php/Open_redirect 。使用 django.utils.http.is_safe_url。此外,在模板中,您可以使用 {{ request.get_full_path|urlencode }} 而不是 {{ currentUrl }}。此外,即使保存不成功,也会进行重定向
    • @spookylukey 你有更好的选择吗?
    • 您如何保留通常会插入到请求中但不是的成功保存消息?
    【解决方案2】:

    “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
    

    【讨论】:

      猜你喜欢
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多