Skip to main content
 首页 » 编程设计

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

2025年04月02日34三少

在 Django 管理 ListView 中,我想隐藏没有名称的产品。我只是在 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

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

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

请您参考如下方法:

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

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