Roberto Franco
Roberto Franco

Reputation: 3

Django Tables2 Filter

I am trying to display a table with filter using Django tables 2 and crispy forms.

I have the following files:

filter.py

import django_filters
from .models import Poste
class PosteFilter(django_filters.FilterSet):
    id = django_filters.CharFilter(lookup_expr='icontains')
    status = django_filters.CharFilter(lookup_expr='icontains')
    address = django_filters.CharFilter(name='address', lookup_expr='icontains')
    atualizado_em  = django_filters.CharFilter(lookup_expr='icontains')

class Meta:
    model = Poste
    fields = {'id', 'status', 'address', 'atualizado_em',}

forms.py

from django import forms
from .models import Poste
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, ButtonHolder, Submit

class PosteListFormHelper(FormHelper):
    model = Poste
    form_tag = False
    form_style = 'inline'
    layout = Layout(
        'id',
        'status',
        'address',
        'atualizado_em',
        Submit('submit', 'Filtrar'),
    )

table.py

import django_tables2 as tables
from .models import Poste

class PosteTable(tables.Table):
class Meta:
    model = Poste
    # add class="paleblue" to <table> tag
    attrs = {'class': 'paleblue'}
    fields = ('id', 'status', 'address', 'atualizado_em')
    per_page: 25

As a result, I get this:

enter image description here

What I want is:

  1. exclude the word "contains" in the label
  2. have the filter form fields inline

I tried many ways to do that without success.

Upvotes: 0

Views: 3228

Answers (2)

Rami Alloush
Rami Alloush

Reputation: 2626

I use FormHelper to make the form inline

class UnitFilterFormHelper(FormHelper):
    form_method = 'GET'
    form_style = 'inline'
    form_show_labels = False
    label_class = 'col-md-1'
    field_class = 'col-md-11'
    layout = Layout(
        HTML('<hr>'),
        Row(
            Column('branch', css_class="col-md-10"),
            Column(Submit('submit', _('Apply Filter')), css_class="col-md-2"),
            # css_class="form-inline",
        ),
    )

Upvotes: 0

Alasdair
Alasdair

Reputation: 308899

It looks as if you can set the label by setting label in the CharFilter:

class PosteFilter(django_filters.FilterSet):
    id = django_filters.CharFilter(lookup_expr='icontains', label='Id')
    status = django_filters.CharFilter(lookup_expr='icontains', label='Status')
    ...

It looks as if you could also change the FILTERS_VERBOSE_LOOKUPS setting, although the docs warn that it's an advanced setting and subject to change.

from django_filters.conf import DEFAULTS

def FILTERS_VERBOSE_LOOKUPS():
    verbose_lookups = DEFAULTS['VERBOSE_LOOKUPS'].copy()
    verbose_lookups['icontains'] = ''  # Don't add any extra text like 'contains'
    return verbose_lookups

Upvotes: 1

Related Questions