如何将自定义CSS类添加到Django过滤器字段

时间:2018-08-01 18:04:07

标签: django django-filter

我试图提出一种适用于表格的方式,但此处该类不适用

class TrainerFilter(django_filters.FilterSet):
    price_lt = django_filters.NumberFilter(field_name="prise", lookup_expr='lt')
    class Meta:
        model = Profile
        fields = ['direction', 'group', 'child', 'price_lt']
        widgets = {
            'direction': SelectMultiple(attrs={'class': 'custom-select'}),     
        }

5 个答案:

答案 0 :(得分:1)

您非常接近。这应该起作用:

class TrainerFilter(django_filters.FilterSet):
    price_lt = django_filters.NumberFilter(field_name="prise", lookup_expr='lt')
    direction = django_filters.CharFilter(widgets = SelectMultiple(attrs={'class': 'custom-select'}))
    class Meta:
        model = Profile
        fields = ['group', 'child', 'price_lt']

答案 1 :(得分:0)

万一有人偶然发现,一种解决方案可能是将类添加到字段的小部件属性中,如下所示:

    class TrainerFilter(django_filters.FilterSet):

        ...

        def __init__(self, data=None, queryset=None, *, request=None, prefix=None):
            super(TrainerFilter, self).__init__(data=data, queryset=queryset, request=request, prefix=prefix)
            self.filters['direction'].field.widget.attrs.update({'class': 'custom-select'})

答案 2 :(得分:0)

class UsersFilter(django_filters.FilterSet):
class Meta:
    model = UsersModels
    fields = ['username', 'email', 'first_name', 'phone']
    filter_overrides = {
        models.CharField: {
            'filter_class': django_filters.CharFilter,
            'extra': lambda f: {
                'lookup_expr': 'icontains',
                'widget': forms.TextInput(attrs={'class': 'form-control'})
            },
        },
        models.EmailField: {
            'filter_class': django_filters.CharFilter,
            'extra': lambda f: {
                'lookup_expr': 'icontains',
                'widget': forms.EmailInput(attrs={'class': 'form-control'})
            },
        },

    }

像这样

答案 3 :(得分:0)

重要提示::当我发现这样做的问题时,请阅读下面的段落,并已链接到源代码,该源代码解释了如何与小部件调整一起使用此方法,以将自定义css添加到过滤器中。

摘自官方文档。

Djano_Filters Docmentation

简单地说,将字段添加到名为“ form”的过滤器元类中,该类使用forms.py类作为其值,就像这样。这有效地扩展了forms.py类。

Adding form field to a filter

自定义字段类型:
从那里您可以像通常那样为form.py自定义字段类型。

enter image description here

实际上使用CSS设置页面样式
从这里您有三个选择。我最不喜欢的(导致很多代码)。使用小部件调整在页面上设置样式。使用引导带(或实际上任何CSS文件类)。或者,最有效的方法是在为表单创建模板时同时使用引导带和widget_tweaks。

但是,除非您对90%的用例进行了非常复杂的过滤或查询,否则您可以在Forms.py类中执行类似以下操作,以使其变得非常简单。

注意:此后,我发现此方法不可靠,请阅读下面的段落以寻求解决方案 enter image description here

重要提示::Django过滤器将CSS可靠地应用于扩展Forms类的这些字段,但它确实允许您仍自定义帮助文本,使用的小部件等,因此我将其保留在答案中。最初它对我有用,但是在将过滤器扩展为可以做更复杂的事情之后,我意识到有些领域被随意地排除在外了。以下是一篇文章,详细介绍了如何使用Django过滤器 WITH 为您执行此操作的自定义窗口小部件调整文件。 Django-filters how to and widget tweaks with css styling

答案 4 :(得分:-1)

我找到的最简单的方法是使用django小部件调整。而且此模块可以使用多种形式,而不仅仅是过滤器。安装后添加到模板

{% load widget_tweaks %}

现在您可以为表单添加类

{{ filter.form.direction.label_tag }}
{% render_field filter.form.direction class="custom-select" %}

已读

{{ filter.form.direction.label_tag }}
 {{ filter.form.direction }}