2013-11-17 3 views
4

У меня есть таблица, основанная на модели с несколькими полями. У меня также есть два TemplateColumn s, один для редактирования конкретного объекта, а другой для его удаления. Вот мой код:Django_tables2: динамически скрывающие столбцы на основе запроса

class EntitetTable(tables.Table): 
    edit = tables.TemplateColumn(template_name='azuriranje/izmena.html', 
          orderable=False, visible=False) 
    delete = tables.TemplateColumn(template_name='azuriranje/brisanje.html', 
          orderable=False, visible=False) 

    class Meta: 
     abstract = True 
     attrs = {'class': 'paleblue', } 

class TipPredmetaTable(EntitetTable): 
    class Meta(EntitetTable.Meta): 
     model = models.TipPredmeta 

Теперь у меня есть иерархия пользователей в моей системе и только для пользователей, которые бухгалтеры могут редактировать и удалять данные. Это, как говорится, я пытался осуществить проверку на мой взгляд, чтобы скрыть два TemplateColumn S:

@login_required 
def tippredmeta(request): 
    try: 
     korisnik = request.user.radnik 
    except ObjectDoesNotExist: 
     return HttpResponseRedirect("/main/") 
    queryset = TipPredmeta.objects.all() 
    table = TipPredmetaTable(queryset) 
    if korisnik.is_kustos: 
     table.edit.visible = True 
     table.delete.visible = True 
    RequestConfig(request).configure(table) 
    return render_to_response('azuriranje/tabelaPrikaz.html', {'table': table, }, 
           context_instance=RequestContext(request)) 

Однако, я получаю следующее исключение на table.edit.visible = True линии:

Exception Type: AttributeError 
Exception Value: 'TipPredmetaTable' object has no attribute 'edit' 

Теперь, вот вещи, которые я пробовал: - Сначала я подумал об использовании полей и исключить, но я не мог изменить это динамически. - Тогда я подумал о том, чтобы поместить все это в метод __init__, эффективно создавая атрибуты редактирования и удаления моей EntitetTabel (идея заключалась в том, чтобы разрешить ошибку), но пока ошибка не исчезла, также были мои TemplateColumns. Я попытался отобразить их через поля, но это не помогло. Я предполагаю, что суперкласс, table.Table, не работает так.

ответ

7

Вы можете использовать атрибут exclude для tables.Table для исключения нежелательных полей. Он также работает после создания экземпляра таблицы. Поэтому в вашем случае вы можете сделать что-то подобное.

Сначала оставить столбцы видны (я удалила visible=False):

class EntitetTable(tables.Table): 
    edit = tables.TemplateColumn(template_name='azuriranje/izmena.html', 
           orderable=False) 
    delete = tables.TemplateColumn(template_name='azuriranje/brisanje.html', 
           orderable=False) 

Затем на основе вашего состояния, вы можете исключающие редактировать и удалять поля:

table = TipPredmetaTable(queryset) 
if not korisnik.is_kustos: 
    table.exclude = ('edit', 'delete',) 
+0

Черт, я был уверен, Я это сделал. Оно работает! Я использую pycharm, поэтому я слишком полагаюсь на его автозаполнение, и когда я не смог найти tabel.exclude, я подумал, что следующий (не столь логичный) шаг должен состоять в том, чтобы перейти к tabel.Meta.exclude, что, конечно, влияет только на объект во время создания. Благодарю. – user2352164

Смежные вопросы