Search code examples
djangodjango-tables2

django-tables2: Changing default column title of a foreign key column


How do I change the column title for a foreign value in django-tables2?

Model

class Employer(models.Model):
    name = models.CharField(verbose_name='Name', max_length=16)

class Employee(models.Model):
    name = models.CharField(verbose_name='Name', max_length=16)
    employer = models.ForeignKey(Employer, verbose_name='Employer')

Table

class EmployeeTable(tables.Table)
    class Meta:
        model = EmployeeTable
        fields = ('name', 'employer.name')

Output

Name | Name
Bill | Steve

I would like to override the default column headers to provide more meaningful information.

Preferred output

Employee name | Employer name
Bill          | Steve

Table (not working)

class EmployeeTable(tables.Table)
    name = tables.Column(verbose_name='Employee name')          # <-- Works!
    employer.name = tables.Column(verbose_name='Employer name') # <-- Doesn't work!
    class Meta:
        model = EmployeeTable
        fields = ('name', 'employer.name')

Solution

  • I've found a solution. You have to use an Accessor.

    from django_tables2.utils import Accessor
    
    class EmployeeTable(tables.Table)
        name = tables.Column(verbose_name='Employee name')
        employer_name = tables.Column(verbose_name='Employer name', orderable=False, accessor=Accessor('employer.name'))
        class Meta:
            model = EmployeeTable
            fields = ('name', 'employer_name')