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
这没有记录但可以工作。不过,标准方法是使用自定义过滤器。
您可以检查您是否在 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
在 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
这没有记录但可以工作。不过,标准方法是使用自定义过滤器。
您可以检查您是否在 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