我有一个模型,我将拥有一个单独的实例,因此我需要覆盖changelist_view以绕过它(仅当我至少保存了一条记录时),并直接跳转到change_view。我在网上找到了代码片段并且它运行良好,所以我写了我的自定义changelist_view:
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是使用对象id硬编码的change_view url。
有更优雅的方式吗?
感谢 路加
答案 0 :(得分:0)
您可以使用模型管理员上的response_change
方法更改管理员在处理修改后重定向到的目标网址。它接收请求和更改的对象作为参数,并可以将重定向返回到动态计算的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
,但我怀疑如果你使用的是单身模型你就需要它。同样,有一些方法可以测试用户是选择“保存并添加另一个”,“保存并继续编辑”还是仅仅“保存”,但您可能并不关心单身人士的区别。
答案 1 :(得分:0)
使用时
def changelist_view(self, request, extra_context=None):
django会在Html输出中插入一个action =“None”,这会在提交帖子时导致上述错误。而是尝试
def changelist_view(self, request, extra_context=""):