Django-Filter:{{field.value}}在呈现表单字段时为空

时间:2018-03-29 15:02:03

标签: python django django-forms django-filter django-taggit

我正在使用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}}是空的。让我们看一下以下情况:

案例1。

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

案例2。

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

案例3。

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

1 个答案:

答案 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的文档中记录了这一点:

  

为了更精细,您可以使用每个单选按钮的tagchoice_labelid_for_label属性。

再往下,CheckBoxSelectMultiple的文档说同样的逻辑也适用于它。