首页 > 解决方案 > 如何在 django-filter 字段中使用小部件?

问题描述

想要将小部件设置 "class":"form-control" 为 django-filter 字段。

过滤器.py

from django_filters import FilterSet,DateFilter,CharFilter,DateFromToRangeFilter
from django_filters.widgets import RangeWidget,CSVWidget,DateRangeWidget
from django import forms
from .models import Blog

class BlogFilter(FilterSet):
    start_date = DateFilter(field_name="created_at",lookup_expr='gte',label='From date',
        widget=DateFromToRangeFilter(attrs={
            'placeholder':'YYYY/MM/DD',
            'class':'form-control'
            })
    )
    end_date = DateFilter(field_name="created_at",lookup_expr='lte',label='To date')

    blog_name = CharFilter(field_name="blog_name",lookup_expr='icontains',label='Blog Name',
        widget=TextWidgets(attrs={
            'class':'form-control'
        })
    )
    class Meta:
        model = Blog
        fields = ('category','status','user')

也尝试在元类中编写小部件,但没有奏效。

  1. 用于哪个小部件CharFilter?(就像我们forms.TextInput(attrs={'class':'form-control'}在 django 表单中使用的那样)

  2. 用于哪个小部件DateFilter

标签: pythonhtmldjangodjango-filter

解决方案


我这样做的方法是使用模板过滤器。

所以在过滤器的模板中我会做这样的事情;

{% for field in filter.form %}
    {{ field|htmlattributes:"class: form-control" }}
{% endfor %}

过滤器会这样做;

from django import template

register = template.Library()


@register.filter
def htmlattributes(value, arg):
    """ Allows adding of attributes to tagged form elements. """
    attrs = value.field.widget.attrs
    components = arg.split(',')

    for string in components:
        key, values_string = string.split(':')
        values = values_string.strip()

        if attrs.get(key):
            values = attrs.get(key) + ' ' + values

        attrs.update({key: values})

    rendered = str(value)
    return rendered

鉴于您的评论...您需要加载模板标签/过滤器,就像我假设您已经完成的静态等一样。

只需将 a{% load x %}放在模板顶部即可htmlattributes从您放置的任何位置加载。

要了解如何编写自己的模板标签和过滤器,可以在此处找到文档;https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/


推荐阅读