Django - 仅在管理列表中而不是在管理详细信息页面中过滤查询集

Django - Filter QuerySet only in admin-list and not in admin detail page

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

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

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

product object with primary key u'123' does not exist.

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

嗯,你可以覆盖 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

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

您可以检查您是否在 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