【问题标题】:django admin - overriding changelist_view for single entry modelsdjango admin - 覆盖单条目模型的 changelist_view
【发布时间】:2013-05-13 03:15:58
【问题描述】:

我有一个模型,我将拥有一个实例,因此我需要覆盖 changelist_view 以绕过它(仅当我至少保存了一条记录时),然后直接跳转到 change_view。我在网上找到了 sn-p 并且效果很好,所以我编写了我的自定义 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。

有没有更优雅的方式?

谢谢 卢克

【问题讨论】:

    标签: django django-forms django-admin django-views django-urls


    【解决方案1】:

    使用时

    def changelist_view(self, request, extra_context=None):
    

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

    def changelist_view(self, request, extra_context=""):
    

    【讨论】:

      【解决方案2】:

      您可以使用模型管理员上的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,但如果您使用单例模型,我怀疑您是否需要它。同样,有一些方法可以测试用户是选择“保存并添加另一个”、“保存并继续编辑”还是只是“保存”,但您可能并不关心单例的区别。

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 1970-01-01
        • 2016-06-14
        • 2015-03-16
        • 2017-08-23
        • 2011-06-21
        • 2012-04-19
        • 2017-05-26
        • 1970-01-01
        相关资源
        最近更新 更多