Django-Filter - 删除将 return 清空的过滤器选项
Django-Filter - Removing filter options that will return empty
我觉得我好像在这里遗漏了一些非常明显的东西。我正在使用 Django-Filter 来过滤 ListView,它工作得很好,除了你在下拉菜单中获得的选项还包括将 return 空搜索查询的选项。
我已经在我的数据库中预先填充了一堆我需要的数据,但目前还没有使用,特别是“国家”和“地区”模型。
Models.py:
class Nation(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(max_length=100, unique=False)
class Region(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(max_length=100, unique=False)
nation = models.ForeignKey(Nation, on_delete=models.PROTECT)
class Business(models.Model):
name = models.CharField(max_length=200)
nation = models.ManyToManyField(Nation, blank=True,)
region = models.ManyToManyField(Region, blank=True,)
Filters.py:
from business.models import Business, BusinessCategory
from locations.models import Nation, Region
import django_filters
class BusinessFilter(django_filters.FilterSet):
nation = django_filters.ModelChoiceFilter(
field_name='nation', lookup_expr='isnull',
queryset=Nation.objects.all().order_by('name')
)
class Meta:
model = Business
fields = ['business_category', 'nation', 'region']
View.Py:
class BusinessIndexView(ListView):
paginate_by = 6
template_name = "business/index.html"
context_object_name = 'all_business'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['filter']= BusinessFilter(self.request.GET, queryset=self.get_queryset())
return context
def get_queryset(self):
return Business.objects.filter(live=True).order_by('-id')
Filter.html:
{% load crispy_forms_tags %}
<div class="mb-2">
<form method="get">
{{filter.form|crispy}}
<button type="submit" class="btn btn-outline-success my-2 my-sm-0">Search</button>
<a class="btn btn-outline-warning my-2 my-sm-0" href="{% url 'business:index' %}">Reset</a>
</form>
</div>
Filters.py 是我知道它正在中断的地方 down.Any 帮助将不胜感激。我已通读并尝试实现文档的相关部分(“Filtering the related queryset for ModelChoiceFilter”)但无济于事。
编辑:
所需的功能是一个简单的下拉过滤器,以便用户可以通过与企业关联的国家/地区搜索企业。
示例:BBC、英国 - 电讯报、英国 - CNN、美国 - XYZ、美国 - 等
目前,我已将许多国家/地区添加到数据库中,这些国家/地区尚未与企业关联,但将来会关联。我想从下拉列表中删除“空的”国家,直到他们有与之相关的东西。
使用上面的例子,我在我的过滤器中列出了英国、美国和加拿大,但只有英国和美国应该出现,因为与加拿大没有任何关联。
你能试试这个吗:
在你的模型中:
class Business(models.Model):
name = models.CharField(max_length=200)
nation = models.ManyToManyField(Nation, blank=True,related_name='businesses')
region = models.ManyToManyField(Region, blank=True,)
Filter.py
class BusinessFilter(django_filters.FilterSet):
nation = django_filters.ModelChoiceFilter(
field_name='nation', lookup_expr='isnull',
queryset=Nation.objects.exclude(businesses__isnull=True).order_by('name')
)
class Meta:
model = Business
fields = ['business_category', 'nation', 'region']
我觉得我好像在这里遗漏了一些非常明显的东西。我正在使用 Django-Filter 来过滤 ListView,它工作得很好,除了你在下拉菜单中获得的选项还包括将 return 空搜索查询的选项。
我已经在我的数据库中预先填充了一堆我需要的数据,但目前还没有使用,特别是“国家”和“地区”模型。
Models.py:
class Nation(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(max_length=100, unique=False)
class Region(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(max_length=100, unique=False)
nation = models.ForeignKey(Nation, on_delete=models.PROTECT)
class Business(models.Model):
name = models.CharField(max_length=200)
nation = models.ManyToManyField(Nation, blank=True,)
region = models.ManyToManyField(Region, blank=True,)
Filters.py:
from business.models import Business, BusinessCategory
from locations.models import Nation, Region
import django_filters
class BusinessFilter(django_filters.FilterSet):
nation = django_filters.ModelChoiceFilter(
field_name='nation', lookup_expr='isnull',
queryset=Nation.objects.all().order_by('name')
)
class Meta:
model = Business
fields = ['business_category', 'nation', 'region']
View.Py:
class BusinessIndexView(ListView):
paginate_by = 6
template_name = "business/index.html"
context_object_name = 'all_business'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['filter']= BusinessFilter(self.request.GET, queryset=self.get_queryset())
return context
def get_queryset(self):
return Business.objects.filter(live=True).order_by('-id')
Filter.html:
{% load crispy_forms_tags %}
<div class="mb-2">
<form method="get">
{{filter.form|crispy}}
<button type="submit" class="btn btn-outline-success my-2 my-sm-0">Search</button>
<a class="btn btn-outline-warning my-2 my-sm-0" href="{% url 'business:index' %}">Reset</a>
</form>
</div>
Filters.py 是我知道它正在中断的地方 down.Any 帮助将不胜感激。我已通读并尝试实现文档的相关部分(“Filtering the related queryset for ModelChoiceFilter”)但无济于事。
编辑: 所需的功能是一个简单的下拉过滤器,以便用户可以通过与企业关联的国家/地区搜索企业。
示例:BBC、英国 - 电讯报、英国 - CNN、美国 - XYZ、美国 - 等
目前,我已将许多国家/地区添加到数据库中,这些国家/地区尚未与企业关联,但将来会关联。我想从下拉列表中删除“空的”国家,直到他们有与之相关的东西。
使用上面的例子,我在我的过滤器中列出了英国、美国和加拿大,但只有英国和美国应该出现,因为与加拿大没有任何关联。
你能试试这个吗:
在你的模型中:
class Business(models.Model):
name = models.CharField(max_length=200)
nation = models.ManyToManyField(Nation, blank=True,related_name='businesses')
region = models.ManyToManyField(Region, blank=True,)
Filter.py
class BusinessFilter(django_filters.FilterSet):
nation = django_filters.ModelChoiceFilter(
field_name='nation', lookup_expr='isnull',
queryset=Nation.objects.exclude(businesses__isnull=True).order_by('name')
)
class Meta:
model = Business
fields = ['business_category', 'nation', 'region']