Django-Filter |循环使用表单字段

时间:2017-11-13 10:14:55

标签: django django-forms django-filter

我正在使用按预期工作的django-filter。然而,我正在尝试遍历表单字段,但standard django attributes无法正常工作。唯一能做的就是{{ form.id_for_label }}。我错过了什么吗?

我的模板代码:

<form action="" method="get">
    {% for form in forms.form.product_colours %}
    <div class="form-group">
        <input type="checkbox"  name="product_colours" id="{{ form.id_for_label }}" value="{{ form.value }}">
        <label for="{{ form.id_for_label }}">{{ form.label }}</label>
    </div>
    {% endfor %}
    <input type="submit" />
</form>

我不想简单地使用{{ form }}的原因是因为它在<label>之前加载了<input>,而我需要它来反复工作以适应models进入我的造型。我宁愿不必改变造型。

如果需要,我的(简体)FilterSetview和我的class ProductColour(models.Model): name = models.CharField(max_length=255) colour_hex = models.CharField(max_length=16, default="#FFF") def __str__(self): return self.name class Product(Page): # My product fields product_colours = ParentalManyToManyField('products.ProductColour', blank=True)

模型

class ProductFilter(django_filters.FilterSet):
    product_colours = django_filters.ModelMultipleChoiceFilter(name="product_colours", 
        label="Product Colour", 
        widget=forms.CheckboxSelectMultiple, 
        queryset=ProductColour.objects.all(), 
        conjoined=False)

    class Meta:
        model = Product
        fields = ['product_colours']

FilterSet

def get_context(self, request):
    context = super(Page, self).get_context(request)

    all_products = ProductFilter(request.GET, queryset=Product.objects.live()).qs
    forms = ProductFilter(request.GET, queryset=Product.objects.live())

    paginator = Paginator(all_products, 9) # Show 9 resources per page

    page = request.GET.get('page')

    try:
        products = paginator.page(page)
    except PageNotAnInteger:
        products = paginator.page(1)
    except EmptyPage:
        products = paginator.page(paginator.num_pages)

    context['forms'] = forms
    context['products'] = products

    return context

查看

ParentalManyToManyField

如果您想知道Mouse Hover是什么,它是Wagtail CMS类。

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了解决方案 - 正如用户@Vicmathur在上面的评论中建议的那样,我尝试添加{% for check in form %}{% endfor %}并且它引发了'BoundWidget' object is not iterable错误。

所以我用Google搜索了BoundWidget并找到了related Django documentation

我没有尝试通过{{ form.value }}访问数据,而是指定{{ form.data.value }}