模板

时间:2018-03-18 15:27:04

标签: django django-filter

我使用的是django-filter软件包。我的页面显示所有书籍。我有5种类型。我希望有人能够点击一个可怕的"按钮,并过滤我的图书清单(用户不必也点击"提交",只是流派按钮)。

但是现在当我点击一个流派按钮时,它并没有过滤。除非我在filters.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的帮助!我还必须将{%for genre in filter.form.genre%}更改为{%for genre in genre_list%},其中在我的视图中,genre_list = Genre.objects.all()。否则,按钮值为value = option value = 10而不是value = 10.

2 个答案:

答案 0 :(得分:0)

您可以为按钮添加名称和值。单击此按钮,在提交表单之前,还会将指定名称的属性设置为指定值

<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>

答案 1 :(得分:0)

我尝试了@GwynBleidD的方法,但遇到了与@ tei1相同的问题。似乎filter.form的内容是生成的html,所以genre是实际的html选项,如下所示:

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

...这与OP的要求或我一直在寻找的功能不太匹配。

我可以通过在上下文中为过滤器提供用于我的过滤值的数据来使其工作。我正在使用基于类的视图,看起来像这样:

    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>