Я использую приложение Django filter: https://github.com/carltongibson/django-filter
Я создаю приложение web-comi c и что я пытаюсь сделать sh - это раскрывающееся поле фильтра, в котором отображаются различные значения для этого поля. В этом случае поле series .
После прочтения их документов. И вопросы переполнения стека, такие как этот или этот . Я могу заставить форму фильтра отображать правильные выпадающие значения. Но когда я пытаюсь отфильтровать их, мой набор запросов результатов не возвращает значений!
В документах должно быть что-то, чего я не понимаю. Вот мой надеюсь соответствующий код.
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 в моем классе фильтров с аналогичным результатом (но значения отображаются в формате Tuple):
series=django_filters.ModelChoiceFilter(queryset=ComicPanel.objects.all().values_list('series').distinct())
Может кто-нибудь сказать, что я делаю не так?