Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django tables2 create extra column with links

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

like image 959
Hans de Jong Avatar asked Apr 08 '14 15:04

Hans de Jong


2 Answers

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:

from django_tables2.utils import A
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.

like image 92
4 revs, 3 users 93% Avatar answered Sep 24 '22 04:09

4 revs, 3 users 93%


To have the link properly formatted and with a link text of your choice, you can do the following in the table class:

def render_edit_link(self,record):
    return mark_safe('<a href='+reverse("edit", args=[record.pk])+'>Edit</a>')

Where 'edit' is the name of the url.

like image 25
Paul Fennema Avatar answered Sep 22 '22 04:09

Paul Fennema