Remove 'help_text', add verbose labels
This commit is contained in:
parent
269140d5d7
commit
22824cf6c6
|
@ -19,7 +19,7 @@ from .fields import (
|
|||
Lookup, LookupTypeField, BaseCSVField, BaseRangeField, RangeField,
|
||||
DateRangeField, DateTimeRangeField, TimeRangeField, IsoDateTimeField
|
||||
)
|
||||
from .utils import deprecate, pretty_name
|
||||
from .utils import deprecate, label_for_filter, pretty_name
|
||||
|
||||
|
||||
__all__ = [
|
||||
|
@ -127,18 +127,24 @@ class Filter(object):
|
|||
return locals()
|
||||
lookup_type = property(**lookup_type())
|
||||
|
||||
def label():
|
||||
def fget(self):
|
||||
if self._label is None and hasattr(self, 'parent'):
|
||||
model = self.parent._meta.model
|
||||
self._label = label_for_filter(
|
||||
model, self.name, self.lookup_expr, self.exclude
|
||||
)
|
||||
return self._label
|
||||
|
||||
def fset(self, value):
|
||||
self._label = value
|
||||
|
||||
return locals()
|
||||
label = property(**label())
|
||||
|
||||
@property
|
||||
def field(self):
|
||||
if not hasattr(self, '_field'):
|
||||
help_text = self.extra.pop('help_text', None)
|
||||
if help_text is None:
|
||||
if self.exclude and settings.HELP_TEXT_EXCLUDE:
|
||||
help_text = _('This is an exclusion filter')
|
||||
elif not self.exclude and settings.HELP_TEXT_FILTER:
|
||||
help_text = _('Filter')
|
||||
else:
|
||||
help_text = ''
|
||||
|
||||
if (self.lookup_expr is None or
|
||||
isinstance(self.lookup_expr, (list, tuple))):
|
||||
|
||||
|
@ -162,11 +168,11 @@ class Filter(object):
|
|||
|
||||
self._field = LookupTypeField(self.field_class(
|
||||
required=self.required, widget=self.widget, **self.extra),
|
||||
lookup, required=self.required, label=self.label, help_text=help_text)
|
||||
lookup, required=self.required, label=self.label)
|
||||
else:
|
||||
self._field = self.field_class(required=self.required,
|
||||
label=self.label, widget=self.widget,
|
||||
help_text=help_text, **self.extra)
|
||||
**self.extra)
|
||||
return self._field
|
||||
|
||||
def filter(self, qs, value):
|
||||
|
@ -440,6 +446,7 @@ class BaseCSVFilter(Filter):
|
|||
base_field_class = BaseCSVField
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs.setdefault('help_text', _('Multiple values may be separated by commas.'))
|
||||
super(BaseCSVFilter, self).__init__(*args, **kwargs)
|
||||
|
||||
class ConcreteCSVField(self.base_field_class, self.field_class):
|
||||
|
|
|
@ -433,8 +433,7 @@ class BaseFilterSet(object):
|
|||
|
||||
default = {
|
||||
'name': name,
|
||||
'label': capfirst(f.verbose_name),
|
||||
'lookup_expr': lookup_expr
|
||||
'lookup_expr': lookup_expr,
|
||||
}
|
||||
|
||||
filter_class, params = cls.filter_for_lookup(f, lookup_type)
|
||||
|
@ -454,7 +453,6 @@ class BaseFilterSet(object):
|
|||
queryset = f.field.model._default_manager.all()
|
||||
default = {
|
||||
'name': name,
|
||||
'label': capfirst(rel.related_name),
|
||||
'queryset': queryset,
|
||||
}
|
||||
if rel.multiple:
|
||||
|
|
|
@ -336,12 +336,10 @@ class IntegrationTestFiltering(CommonFilteringTestCase):
|
|||
<p>
|
||||
<label for="id_decimal">Decimal:</label>
|
||||
<input id="id_decimal" name="decimal" step="any" type="number" />
|
||||
<span class="helptext">Filter</span>
|
||||
</p>
|
||||
<p>
|
||||
<label for="id_date">Date:</label>
|
||||
<input id="id_date" name="date" type="text" />
|
||||
<span class="helptext">Filter</span>
|
||||
</p>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
|
|
|
@ -7,7 +7,7 @@ import mock
|
|||
import warnings
|
||||
|
||||
from django import forms
|
||||
from django.test import TestCase, override_settings
|
||||
from django.test import TestCase
|
||||
|
||||
from django_filters import filters, widgets
|
||||
from django_filters.fields import (
|
||||
|
@ -64,27 +64,6 @@ class FilterTests(TestCase):
|
|||
f = Filter()
|
||||
field = f.field
|
||||
self.assertIsInstance(field, forms.Field)
|
||||
self.assertEqual(field.help_text, 'Filter')
|
||||
|
||||
def test_field_with_exclusion(self):
|
||||
f = Filter(exclude=True)
|
||||
field = f.field
|
||||
self.assertIsInstance(field, forms.Field)
|
||||
self.assertEqual(field.help_text, 'This is an exclusion filter')
|
||||
|
||||
@override_settings(FILTERS_HELP_TEXT_FILTER=False)
|
||||
def test_default_field_settings(self):
|
||||
f = Filter()
|
||||
field = f.field
|
||||
self.assertIsInstance(field, forms.Field)
|
||||
self.assertEqual(field.help_text, '')
|
||||
|
||||
@override_settings(FILTERS_HELP_TEXT_EXCLUDE=False)
|
||||
def test_field_with_exclusion_settings(self):
|
||||
f = Filter(exclude=True)
|
||||
field = f.field
|
||||
self.assertIsInstance(field, forms.Field)
|
||||
self.assertEqual(field.help_text, '')
|
||||
|
||||
def test_field_with_single_lookup_expr(self):
|
||||
f = Filter(lookup_expr='iexact')
|
||||
|
@ -102,7 +81,6 @@ class FilterTests(TestCase):
|
|||
f = Filter(lookup_expr=None, exclude=True)
|
||||
field = f.field
|
||||
self.assertIsInstance(field, LookupTypeField)
|
||||
self.assertEqual(field.help_text, 'This is an exclusion filter')
|
||||
|
||||
def test_field_with_list_lookup_expr(self):
|
||||
f = Filter(lookup_expr=('istartswith', 'iendswith'))
|
||||
|
@ -119,8 +97,7 @@ class FilterTests(TestCase):
|
|||
f.field
|
||||
mocked.assert_called_once_with(required=False,
|
||||
label='somelabel',
|
||||
widget='somewidget',
|
||||
help_text=mock.ANY)
|
||||
widget='somewidget')
|
||||
|
||||
def test_field_extra_params(self):
|
||||
with mock.patch.object(Filter, 'field_class',
|
||||
|
@ -128,8 +105,8 @@ class FilterTests(TestCase):
|
|||
f = Filter(someattr='someattr')
|
||||
f.field
|
||||
mocked.assert_called_once_with(required=mock.ANY,
|
||||
label=mock.ANY, widget=mock.ANY,
|
||||
help_text=mock.ANY,
|
||||
label=mock.ANY,
|
||||
widget=mock.ANY,
|
||||
someattr='someattr')
|
||||
|
||||
def test_field_with_required_filter(self):
|
||||
|
@ -137,8 +114,9 @@ class FilterTests(TestCase):
|
|||
spec=['__call__']) as mocked:
|
||||
f = Filter(required=True)
|
||||
f.field
|
||||
mocked.assert_called_once_with(required=True, label=mock.ANY,
|
||||
widget=mock.ANY, help_text=mock.ANY)
|
||||
mocked.assert_called_once_with(required=True,
|
||||
label=mock.ANY,
|
||||
widget=mock.ANY)
|
||||
|
||||
def test_filtering(self):
|
||||
qs = mock.Mock(spec=['filter'])
|
||||
|
|
|
@ -78,7 +78,30 @@ class FilterSetFormTests(TestCase):
|
|||
fields = ('title',)
|
||||
|
||||
f = F().form
|
||||
self.assertEqual(f.fields['title'].help_text, "This is an exclusion filter")
|
||||
self.assertEqual(f.fields['title'].label, "Exclude title")
|
||||
|
||||
def test_complex_form_fields(self):
|
||||
class F(FilterSet):
|
||||
username = CharFilter(label='Filter for users with username')
|
||||
exclude_username = CharFilter(name='username', lookup_expr='iexact', exclude=True)
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = {
|
||||
'status': ['exact', 'lt', 'gt'],
|
||||
'favorite_books__title': ['iexact', 'in'],
|
||||
'manager_of__users__username': ['exact'],
|
||||
}
|
||||
|
||||
fields = F().form.fields
|
||||
self.assertEqual(fields['username'].label, 'Filter for users with username')
|
||||
self.assertEqual(fields['exclude_username'].label, 'Exclude username')
|
||||
self.assertEqual(fields['status'].label, 'Status')
|
||||
self.assertEqual(fields['status__lt'].label, 'Status is less than')
|
||||
self.assertEqual(fields['status__gt'].label, 'Status is greater than')
|
||||
self.assertEqual(fields['favorite_books__title__iexact'].label, 'Favorite books title')
|
||||
self.assertEqual(fields['favorite_books__title__in'].label, 'Favorite books title is in')
|
||||
self.assertEqual(fields['manager_of__users__username'].label, 'Manager of users username')
|
||||
|
||||
def test_form_fields_using_widget(self):
|
||||
class F(FilterSet):
|
||||
|
@ -118,8 +141,8 @@ class FilterSetFormTests(TestCase):
|
|||
fields = ('book_title',)
|
||||
|
||||
f = F().form
|
||||
self.assertEqual(f.fields['book_title'].label, None)
|
||||
self.assertEqual(f['book_title'].label, 'Book title')
|
||||
self.assertEqual(f.fields['book_title'].label, "Title")
|
||||
self.assertEqual(f['book_title'].label, "Title")
|
||||
|
||||
def test_form_field_with_manual_name_and_label(self):
|
||||
class F(FilterSet):
|
||||
|
|
Loading…
Reference in New Issue