【发布时间】:2020-05-31 06:14:42
【问题描述】:
我正在使用 Django 过滤器应用程序:https://github.com/carltongibson/django-filter
我正在制作一个网络漫画应用程序,我想要完成的是一个下拉过滤器字段,它显示该字段的不同值。在这种情况下,series 字段。
阅读他们的文档后。还有像 this one 或 this one 这样的堆栈溢出问题。我可以使过滤器表单显示正确的下拉值。但是当我尝试按它们过滤时,我的结果查询集没有返回任何值!
文档中一定有我不理解的内容。这是我的希望相关代码。
models.py
>class ComicPanel(models.Model):
#... Other fields
series = models.CharField(max_length = 255, null = False, blank = False, default = getMainSeriesName)
# Other Filter Fields
chapter = models.FloatField(null = True, blank = True)
episode = models.IntegerField(null = True, blank = True)
class Meta:
constraints = [
models.UniqueConstraint(fields=['series','chapter', 'episode'])
]
def __str__(self):
return self.title
def save(self):
super(ComicPanel, self).save()
filters.py
>import django_filters
from .models import ComicPanel
# Grab Distinct values for series
def getUniqueSeries():
series_dicts = ComicPanel.objects.all().values_list('series').distinct()
series_list = []
i = 0
for item in series_dicts:
series_list.append((i,item[0]))
i = i+1
return series_list
class ComicPanelFilter(django_filters.FilterSet):
series = django_filters.ChoiceFilter(choices = getUniqueSeries())
class Meta:
model = ComicPanel
fields = ['chapter', 'episode']
views.py
>def view_archive(request):
comic_list = ComicPanel.objects.all()
comic_filter = ComicPanelFilter(request.GET, queryset=comic_list)
paginator = Paginator(comic_filter.qs, 8)
page = request.GET.get('page', 1)
try:
comics = paginator.page(page)
except (PageNotAnInteger, TypeError):
comics = paginator.page(1)
except EmptyPage:
comics = paginator.page(paginator.num_pages)
return render(request, 'comics/comic_archive.html', context = {'filter': comic_filter, 'comics': comics})
模板.html
...
<form class="form" method="GET">
{% csrf_token %}
<table class="my_classes">
<thead>
<tr>
<th scope="col">Filter Comics: </th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% for field in filter.form %}
<tr>
<th scope="row"> {{ field.name }}</th>
<td>{{ field }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<button type="submit" class="btn btn-outline-dark">Filter</button>
</form>
...
{% if comics %}
{% for comic in comics %}
...
{% endfor %}
<!-- if no comics -->
{% else %}
<p class = "my_class"> Looks like you don't have any comics! Upload some? </p>
{% endif %}
结果:
我的过滤器表单为下拉项目显示正确、独特的系列。但是当我按任何值过滤时,查询集不会返回任何漫画
我也尝试在我的过滤器类中使用 ModelChoiceFilter,结果相似(但值以元组格式显示):
series=django_filters.ModelChoiceFilter(queryset=ComicPanel.objects.all().values_list('series').distinct())
谁能告诉我我做错了什么?
【问题讨论】:
-
你能分享你
ComicPanel模型的相关部分吗? -
@WillemVanOnsem 进行了更新
标签: python django python-3.6 django-filter