gpt4 book ai didi

django admin - 覆盖单项模型的更改 ListView

转载 作者:行者123 更新时间:2023-12-04 18:09:57 24 4
gpt4 key购买 nike

我有一个模型,我将有一个实例,所以我需要覆盖 changelist_view 以绕过它(仅当我至少保存了一条记录时),然后直接跳转到 change_view。我在网上找到了片段并且它很适合它,所以我写了我的自定义更改 ListView :

def changelist_view(self, request, extra_context=None):
queryset = self.model.objects.all()
if queryset.count()>0:
try:
obj = queryset[0]
return self.change_view(request, str(obj.id), extra_context)
except IndexError:
pass
return super(MyModelAdmin, self).changelist_view(request, extra_context)

这一直有效,直到我尝试保存。与普通 change_view 的区别在于 url。法线具有对象 ID:

http://127.0.0.1:8000/admin/myapp/mymodel/2

我有修改后的版本:

http://127.0.0.1:8000/admin/myapp/mymodel/

如果我尝试保存我得到这个错误:

    You called this URL via POST, but the URL doesn't end 
in a slash and you have APPEND_SLASH set. Django can't redirect to
the slash URL while maintaining POST data. Change your form to
point to 127.0.0.1:8000/admin/myapp1/mymodel/None/ (note
the trailing slash), or set APPEND_SLASH=False in your
Django settings.

目前唯一对我有用的技巧是 HttpResponseRedirect(url),作为 url 的 change_view url 用对象 id 硬编码。

有没有更优雅的方式?

谢谢卢克

最佳答案

您可以使用模型管理上的 response_change 方法更改管理将在处理您的编辑后重定向到的目标 URL。它接收请求和更改后的对象作为参数,并可以将重定向返回到动态计算的 URL。

def response_change(self, request, obj):
# call the parent version to collect messages for the user
original_response = super(MyModelAdmin, self).response_change(request, obj)
if "_popup" in request.POST:
return original_response
return HttpResponseRedirect(reverse("admin:myapp_mymodel_change", args=[obj.id]))

还有一个 response_add,但我怀疑如果您使用的是单例模型,您是否需要它。同样,有一些方法可以测试用户是选择了“保存并添加另一个”、“保存并继续编辑”还是只是“保存”,但对于单例,您可能不关心这种区别。

关于django admin - 覆盖单项模型的更改 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16617755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com