Django Поле выбора фильтра отображает правильные значения, но не фильтрует - PullRequest
1 голос
/ 16 февраля 2020

Я использую приложение 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())

Может кто-нибудь сказать, что я делаю не так?

1 Ответ

0 голосов
/ 16 февраля 2020

Моя ошибка была довольно глупой на самом деле,

Если мы посмотрим на Django документы для field.choices:

Первый элемент в каждом кортеж - это фактическое значение, которое должно быть установлено в модели, а второй элемент - это удобочитаемое имя.

Итак, этот метод:

# 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

возвращает список, который выглядит следующим образом: [(0, 'series1'), (1, 'series2'), ...]

Для моей модели первое значение кортежа должно быть именем серии. Таким образом, список должен выглядеть следующим образом: [('series1', 'series1'), ('series2', 'series2'), ...]

Таким образом, простое решение заключается в изменении этой строки:

series_list.append((i,item[0]))

к этому:

series_list.append((item[0],item[0]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...