кнопка django-filter в шаблоне

Я использую пакет django-filter. На моей странице отображаются все книги. У меня 5 жанров. Я хочу, чтобы кто-то мог нажать «страшную» кнопку и отфильтровать мой список книг (пользователь не должен также нажимать «отправить», только кнопку жанра).

Но сейчас, когда я нажимаю кнопку жанра, он не фильтруется. Если я не использую виджет флажка в моем файле filter.py (закомментирован), установите флажок, а затем нажмите кнопку жанра, но это выглядит некрасиво.

Заранее спасибо за помощь!

Filters.py

class BookFilter(django_filters.FilterSet):
    genre = django_filters.ModelMultipleChoiceFilter(queryset=Genre.objects.all(),
#widget=CheckboxSelectMultiple)
    class Meta:
        model = Book
        fields = ['genre']

book_list.html

<form method="get">
  <ul>
    {% for genre in filter.form.genre %}
    <li>
      <button type="submit" class="button">
        {{ genre }}
      </button>
    </li>
    {% endfor %}
  </ul>
</form>

Обновление Спасибо GwynBleidD за помощь! Мне также пришлось изменить {% для жанра в filter.form.genre %} на {% для жанра в жанре_списка %}, где в моих представлениях жанр_список=Genre.objects.all(). В противном случае значение кнопки было бы value=option value=10 вместо value=10.


person tei1    schedule 18.03.2018    source источник


Ответы (2)


Вы можете добавить имя и значение к вашей кнопке. Таким образом, кнопка при нажатии также установит для свойства указанного имени указанное значение перед отправкой формы.

<form method="get">
  <ul>
    {% for genre in filter.form.genre %}
    <li>
      <button type="submit" class="button" name="genre" value="{{ genre }}">
        {{ genre }}
      </button>
    </li>
    {% endfor %}
  </ul>
</form>
person GwynBleidD    schedule 18.03.2018
comment
Спасибо за быстрый ответ! Теперь названия кнопок говорят: страшно›. И когда я нажимаю на страшно›, URL-адрес становится /books/?genre=‹option+value%3D. Я очень новичок в django, это должно быть быстрое решение? - person tei1; 18.03.2018
comment
Вероятно, у вас есть синтаксическая ошибка в вашем HTML. Проверьте это и исправьте. - person GwynBleidD; 18.03.2018

Я попробовал метод @GwynBleidD, но столкнулся с той же проблемой, что и @tei1. Кажется, что содержимое filter.form — это сгенерированный html, поэтому genre — это фактическая опция html, как показано ниже:

<option value="">---------</option>

... что не совсем соответствует тому, что хотел ОП, или тому, что я искал.

Я смог заставить его работать, предоставив данные для моих значений фильтрации в контексте вместе с фильтром. Я использую представления на основе классов и выглядит примерно так:

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        context['genres'] = Genre.objects.all()
        context['filter'] = BookFilter(self.request.GET, queryset=Books.objects.all())
        return context

И следующий шаблон, предполагающий, что значение, которое вы хотите отобразить для фильтра, доступно в атрибуте name модели жанра:

<form method="get">
  <ul>
    {% for genre in genres %}
    <li>
      <button type="submit" class="button" name="genre" value="{{ genre.id }}">
        {{ genre.name }}
      </button>
    </li>
    {% endfor %}
  </ul>
</form>

И если вы хотите, чтобы кнопка «выбрать все» не применялась к фильтру:

<form method="get">
  <ul>
    <li>
      <button type="submit" class="button" name="genre" value="" selected>
        All Genres
      </button>
    </li>
    {% for genre in genres %}
    <li>
      <button type="submit" class="button" name="genre" value="{{ genre.id }}">
        {{ genre.name }}
      </button>
    </li>
    {% endfor %}
  </ul>
</form>
person hulin003    schedule 31.01.2019