【问题标题】:Django - Filter QuerySet only in admin-list and not in admin detail pageDjango - 仅在管理列表中而不在管理详细信息页面中过滤查询集
【发布时间】:2016-10-27 13:02:45
【问题描述】:

在 Django 管理列表视图中,我想隐藏没有名称的产品。我只是在 get_query_set() 方法中排除了它们。

 def get_queryset(self, request):
    qs = super(ProductAdmin, self).get_queryset(request)
    return qs.exclude(name=None)

这是完美的,但我希望能够在管理详细信息页面(带有直接链接)中访问没有名称的产品。 当它尝试这个时,我有一个错误,因为它从查询集中过滤了产品: http://127.0.0.1/product/123

主键为 u'123' 的产品对象不存在。

是否有解决此问题的方法?如果可能,不要向列表视图添加自定义过滤器。

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    好吧,你可以覆盖get_object

    def get_object(self, request, object_id, from_field=None):
        """
        Returns an instance matching the field and value provided, the primary
        key is used if no field is provided. Returns ``None`` if no match is
        found or the object_id fails validation.
        """
    
        model = product
        field = model._meta.pk if from_field is None else model._meta.get_field(from_field)
        try:
            object_id = field.to_python(object_id)
            return model.objects.get(**{field.name: object_id})
        except (model.DoesNotExist, ValidationError, ValueError):
            return None
    

    这是未记录的,但可以使其工作。但标准方法是使用自定义过滤器。

    【讨论】:

      【解决方案2】:

      你可以检查你是在change还是changelist

      def get_queryset(self, request):
          qs = super(ProductAdmin, self).get_queryset(request)
          if request.resolver_match.url_name == "APPNAME_MODELNAME_changelist":
              return qs.exclude(name=None)
          return qs
      

      Django 版本:1.9

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2018-11-16
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多