Handle retrieving field.verbose_name in a Django 1.8 compat way

If a field is a ManyToOneRel instance then retrieve the verbose_name of
the related field.
This commit is contained in:
Michael van Tellingen 2015-04-29 23:11:27 +02:00 committed by Michael van Tellingen
parent 679eb76daa
commit 5792fb93ea
3 changed files with 28 additions and 2 deletions

View File

@ -5,6 +5,7 @@ from itertools import islice
import warnings
from django.db.models.fields import FieldDoesNotExist
from django import VERSION as django_version
import six
from django_tables2.templatetags.django_tables2 import title
@ -465,8 +466,13 @@ class BoundColumn(object):
parts = self.accessor.split('.')
field = None
for part in parts:
try:
field = model._meta.get_field(part)
if django_version < (1, 8, 0):
field, _, _, _ = model._meta.get_field_by_name(part)
else:
field = model._meta.get_field(part)
except FieldDoesNotExist:
break
if hasattr(field, 'rel') and hasattr(field.rel, 'to'):
@ -474,7 +480,10 @@ class BoundColumn(object):
continue
break
if field:
name = field.verbose_name
if hasattr(field, 'field'):
name = field.field.verbose_name
else:
name = field.verbose_name
return name
@property

View File

@ -54,6 +54,11 @@ class Region(models.Model):
return self.name
class PersonInformation(models.Model):
person = models.ForeignKey(
Person, related_name='info_list', verbose_name='Information')
# -- haystack -----------------------------------------------------------------
if not six.PY3: # Haystack isn't compatible with Python 3

View File

@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy
from django.utils.safestring import mark_safe, SafeData
import pytest
import django_tables2 as tables
from ..app.models import Person
@ -51,6 +52,17 @@ def test_should_support_safe_verbose_name_via_model():
assert isinstance(table.columns["safe"].header, SafeData)
@pytest.mark.django_db
def test_handle_verbose_name_of_many2onerel():
class Table(tables.Table):
count = tables.Column(accessor='info_list.count')
Person.objects.create(first_name='bradley', last_name='ayers')
table = Table(Person.objects.all())
assert table.columns['count'].verbose_name == 'Information'
def test_sortable_backwards_compatibility():
# Table.Meta.sortable (not set)
class SimpleTable(tables.Table):