1: To make an entire column hidden, you can "exclude" that field from the table in the view.
class MyTableView(SingleTableView):
# class based view
model = MyModel
table_class = MyTable
def get_table(self, **kwargs):
table = super(MyTableView, self).get_table(**kwargs)
if not self.request.user.has_perm("can_edit"):
table.exclude = ('edit_button',)
return table
def my_table_view(request):
# function based view
table = MyTable(<queryset>)
if not request.user.has_perm("can_edit"):
table.exclude = ('edit_button',)
[...]
return render(request, template, context)
2: To hide the button in the column, you can check for permission before rendering the edit button by using a custom render function.
https://django-tables2.readthedocs.io/en/latest/pages/custom-data.html#table-render-foo-methods
class MyTable(tables.Table):
edit_button = tables.Column()
def render_edit_button(self, record):
if request.user.has_perm("can_edit"):
url = reverse("edit_view", args=(record.id,))
return mark_safe(f'<a href="{url}">Edit {record.id}</a>')
return mark_safe("")