django tables2 create extra column with links

Hans de Jong picture Hans de Jong · Apr 8, 2014 · Viewed 10.4k times · Source

I am trying to add a extra column to one of my tables, that adds url to another page.

My Table:

class ItemTable(tables.Table):
    edit = tables.LinkColumn('item_edit', args=[A('pk')])
    class Meta:
        model = Item
        fields = ('name', 'slot', 'klass', 'rarity', 'price')

my urls:

url(r'^admin/item/edit/(?P<item_id>\d+)/$', views.item_edit, name='item_edit')

Now with this, i get my table, but the last column (edit) only has dashes + the page crashes when i click the title.

i have been looking at http://django-tables2.readthedocs.org/en/latest/#django_tables2.columns.LinkColumn and im not sure where i go wrong

Answer

lanzz picture lanzz · Apr 8, 2014

The problems you've encountered are caused by LinkColumn expecting to be bound to a specific attribute in your Item model, i.e. it is looking for an Item.edit attribute on your instances.

Since you don't actually have an Item.edit attribute, ordering over your edit column makes no sense, and you should mark it as non-orderable:

edit = tables.LinkColumn('item_edit', args=[A('pk')], orderable=False)

The text of the link itself would come from the value of the Item.edit attribute, which you don't have, so you will need to provide it yourself by adding a render_edit method to your table class:

def render_edit(self):
    return 'Edit'

You can replace the 'Edit' string with whatever you want displayed in that column.

Update: As suggested by @SunnySydeUp, you also need to specify empty_values=() for the column, in order to get its value rendered:

edit = tables.LinkColumn('item_edit', args=[A('pk')], orderable=False, empty_values=())

References:
http://django-tables2.readthedocs.org/en/latest/pages/order-by-accessors.html#specifying-alternative-ordering-for-a-column http://django-tables2.readthedocs.org/en/latest/pages/custom-rendering.html#table-render-foo-methods

Disclaimer: This answer is based on the django-tables2 documentation and source code, and hasn't been tested on an actual Django application.