首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django admin -覆盖单项模型的changelist_view

django admin -覆盖单项模型的changelist_view
EN

Stack Overflow用户
提问于 2013-05-18 04:54:36
回答 2查看 3.9K关注 0票数 3

我有一个模型,其中只有一个实例,因此我需要重写changelist_view来绕过它(只有在至少保存了一条记录的情况下),并直接跳到change_view。我在网上找到了snippet,它对它很有效,所以我写了我的自定义changelist_view:

代码语言:javascript
复制
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:

代码语言:javascript
复制
http://127.0.0.1:8000/admin/myapp/mymodel/2

相反,在修改后的版本中,我有:

代码语言:javascript
复制
http://127.0.0.1:8000/admin/myapp/mymodel/

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

代码语言:javascript
复制
    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是用object id硬编码的change_view url。

有没有更优雅的方式?

谢谢卢克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-18 06:20:42

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-07-10 18:03:52

在使用时

代码语言:javascript
复制
def changelist_view(self, request, extra_context=None):

django将在Html输出中插入一个action="None“,这会导致提交帖子时出现上述错误。而不是尝试

代码语言:javascript
复制
def changelist_view(self, request, extra_context=""):
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16617755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档