From 5792fb93ea971f6130b5623ba6293b8aa1e90229 Mon Sep 17 00:00:00 2001 From: Michael van Tellingen Date: Wed, 29 Apr 2015 23:11:27 +0200 Subject: [PATCH] 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. --- django_tables2/columns/base.py | 13 +++++++++++-- tests/app/models.py | 5 +++++ tests/columns/test_general.py | 12 ++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/django_tables2/columns/base.py b/django_tables2/columns/base.py index b0aa69f..ea27678 100644 --- a/django_tables2/columns/base.py +++ b/django_tables2/columns/base.py @@ -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 diff --git a/tests/app/models.py b/tests/app/models.py index 335f225..18a8da9 100644 --- a/tests/app/models.py +++ b/tests/app/models.py @@ -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 diff --git a/tests/columns/test_general.py b/tests/columns/test_general.py index b5a2443..7a08d85 100644 --- a/tests/columns/test_general.py +++ b/tests/columns/test_general.py @@ -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):