Django - 仅在admin-list中过滤QuerySet,而不是在admin详细信息页面中

时间:2016-10-27 13:02:46

标签: python django django-queryset

在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'的产品对象不存在。

这个问题有解决方法吗?如果可能,不向列表视图添加自定义过滤器。

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

您可以查看自己是否在changechangelist

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