我正在使用Django-Filter库!important 。对于代码,我使用Django-taggit。
我构建了以下 filter.py :
class TaskFilter(django_filters.FilterSet):
tags = django_filters.ModelMultipleChoiceFilter(widget=forms.CheckboxSelectMultiple, queryset=Task.tags.most_common())
class Meta:
model = Task
fields = ['tags']
但是,当我将此filter
传递给模板时,它无法正确呈现标记。特别是{{field.value}}是空的。让我们看一下以下情况:
# template.html
{{ filter.form.tags.errors }}
{% for field in filter.form.tags %}
<label for="{{ field.id_for_label }}"></label>
{{ field.value }}
{% endfor %}
# out
<label for="id_tags_0"></label>
<label for="id_tags_1"></label>
<label for="id_tags_2"></label>
# template.html
{{ filter.form.tags.errors }}
{% for field in filter.form.tags %}
<label for="{{ field.id_for_label }}"></label>
{{ field }}
{% endfor %}
# out
<label for="id_tags_0"></label>
<label for="id_tags_0"><input type="checkbox" name="tags" value="4" id="id_tags_0">Tag 1</label>
<label for="id_tags_1"></label>
<label for="id_tags_1"><input type="checkbox" name="tags" value="1" id="id_tags_1">Tag 2</label>
<label for="id_tags_2"></label>
<label for="id_tags_2"><input type="checkbox" name="tags" value="2" id="id_tags_2">Tag 3</label>
# template.html
{{ filter.form.tags.errors }}
{% for field in filter.form.tags %}
{{ field }}
{{ field.label_tag }}
{% endfor %}
#out
<label for="id_tags_0"><input type="checkbox" name="tags" value="4" id="id_tags_0">Tag 1</label>
<label for="id_tags_1"><input type="checkbox" name="tags" value="1" id="id_tags_1">Tag 2</label>
<label for="id_tags_2"><input type="checkbox" name="tags" value="2" id="id_tags_2">Tag 3</label>
我试图理解为什么会这样。为什么我无法获得值as stated in the docs
pip install django-filter + add 'django_filters' to APPS
pip install django-taggit + add 'taggit' to APPS
# models.py
class Task(models.Model):
title = models.CharField(max_length=100, blank=False)
tags = TaggableManager()
# Use the API to create an object.
t = Task.objects.create(title="Title")
t.tags.add("Tag 1","Tag 2")
# views.py
def view(request):
f = TaskFilter(request.GET, queryset=Task.objects.all())
return render(request, 'template.html', {'filter': f}
答案 0 :(得分:3)
当您对filter.form.tags
进行迭代时,您不会迭代一组表单字段,而是遍历tags
字段的一组单独选项。这就是field.value
无效的原因。
这应该起作用:
{{ filter.form.tags.errors }}
{% for choice in filter.form.tags %}
<label for="{{ choice.id_for_label }}"></label>
{{ choice.tag }}
{% endfor %}
其中tag
是每个选项上存在的属性,它将为该选项呈现复选框输入。
RadioSelect的文档中记录了这一点:
为了更精细,您可以使用每个单选按钮的
tag
,choice_label
和id_for_label
属性。
再往下,CheckBoxSelectMultiple的文档说同样的逻辑也适用于它。