Reputation: 3
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:
What I want is:
I tried many ways to do that without success.
Upvotes: 0
Views: 3228
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
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