【问题标题】:Django-Filter: {{ field.value }} is Empty when rendering form fieldsDjango-Filter: {{ field.value }} 在渲染表单字段时为空
【发布时间】:2018-04-03 12:52:48
【问题描述】:

我正在使用 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}

【问题讨论】:

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


    【解决方案1】:

    当您遍历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 的文档说同样的逻辑也适用于它。

    【讨论】:

    • 谢谢,这解释了我的问题。还有一件事,是否可以(使用快捷方式,以简单的方式)检查是否至少检查了该组中的一个标签?
    • P.S.我无法再奖励 6 小时 +50 代表
    • 我不知道有什么捷径可做——认为您必须遍历所有选项才能找出哪些选项被选中。
    • 谢谢,我在 Django 视图中使用request.GET['tags'] 做了一个解决方案,如果有人遇到这个问题,我将它传递给模板。
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2016-07-14
    • 2011-09-21
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多