Django 管理员通过 get_list_filter 在远程字段上进行过滤
Django admin filters on remote field via get_list_filter
我有 3 个模型,由 FK 链接成这样的链:
class Customer(models.Model):
name = models.CharField(max_length=100)
class Order(models.Model):
name = models.CharField(max_length=100)
customer = models.ForeignKey(
'customer.Customer', on_delete=models.PROTECT)
class Task(models.Model):
name = models.CharField(max_length=100)
order = models.ForeignKey(
'order.Order', on_delete=models.PROTECT)
现在,如果在我的 TaskAdmin 中,我使用:
list_filter = ('order__customer', )
一切正常。但是如果我选择:
def get_list_filter(self, request):
return ('order__customer', )
页面加载,但只要我点击任何可能的客户,就会出现 Bad Request (400) 错误页面。对我来说这听起来像是 Django 错误,但也许我在这里做错了什么……有什么提示吗?
我没有足够的声誉来添加评论,所以我会写在这里,即使这不是 真实 答案。
看起来有关于此主题的公开票证:lookup_allowed fails to consider dynamic list_filter
您可以使用两种不同的解决方法来快速解决此问题,直到上游修复它为止:
- 除了
get_list_filter
你还可以定义list_filter = ('order__customer',)
,这样这个字段的查找将永远被列入白名单,即使没有被使用(因为get_list_filter有优先权)
您可以这样覆盖 lookup_allowed
:
def lookup_allowed(self, lookup, *args, **kwargs):
if lookup == 'order__customer__id__exact':
return True
return super(TaskAdmin, self).lookup_allowed(lookup, *args, **kwargs)
这明确允许将用作 url 参数的单个查找。
我有 3 个模型,由 FK 链接成这样的链:
class Customer(models.Model):
name = models.CharField(max_length=100)
class Order(models.Model):
name = models.CharField(max_length=100)
customer = models.ForeignKey(
'customer.Customer', on_delete=models.PROTECT)
class Task(models.Model):
name = models.CharField(max_length=100)
order = models.ForeignKey(
'order.Order', on_delete=models.PROTECT)
现在,如果在我的 TaskAdmin 中,我使用:
list_filter = ('order__customer', )
一切正常。但是如果我选择:
def get_list_filter(self, request):
return ('order__customer', )
页面加载,但只要我点击任何可能的客户,就会出现 Bad Request (400) 错误页面。对我来说这听起来像是 Django 错误,但也许我在这里做错了什么……有什么提示吗?
我没有足够的声誉来添加评论,所以我会写在这里,即使这不是 真实 答案。
看起来有关于此主题的公开票证:lookup_allowed fails to consider dynamic list_filter
您可以使用两种不同的解决方法来快速解决此问题,直到上游修复它为止:
- 除了
get_list_filter
你还可以定义list_filter = ('order__customer',)
,这样这个字段的查找将永远被列入白名单,即使没有被使用(因为get_list_filter有优先权) 您可以这样覆盖
lookup_allowed
:def lookup_allowed(self, lookup, *args, **kwargs): if lookup == 'order__customer__id__exact': return True return super(TaskAdmin, self).lookup_allowed(lookup, *args, **kwargs)
这明确允许将用作 url 参数的单个查找。