В общем судя по всему, проблема в том, что необходимо в шаблоне тег {% render_table django-tables2 %} поместить между тегами <form ...> и </form>, но как быть когда у меня несколько кнопок и несколько разных действий?
У меня шаблон сделан так:
<form action="{% url 'rqst_many_upd' %}" method="post">{% csrf_token %}
{% render_table table 'django_tables2/table.html' %}
<label>Действие с выбранными заявками: </label>
<select name="action" id="change_select">
<option value="">----------</option>
<option value="done">Отметить как выполненное</option>
<option value="cancel">Отметить как отменённое</option>
</select>
<input id="submit_select" type="submit" value="Применить">
</form>
как вариант можно так:
<form action="{% url 'rqst_many_upd' %}" method="post">{% csrf_token %}
{% render_table table 'django_tables2/table.html' %}
<button name="action" type="submit" value="done">Отметить как выполненное</button>
<button name="action" type="submit" value="cancel">Отметить как отменённое</button>
</form>
Во вьюхе обрабатываем разные варианты действий с выбранными заявками:
def rqst_many_upd(request):
action = request.POST.get('action')
arr = [request.POST.get(key) for key in request.POST.keys() if u'check_column' in key]
qs = RqstTbl.objects.filter(pk__in=arr)
if action == u'done':
rows_updated = qs.update(status=u'done', doneDateTime=datetime.now())
msg = u'Количество заявок, отмеченных как исполненные - {}.'
elif action == u'cancel':
rows_updated = qs.update(status=u'cancel', doneDateTime=None)
msg = u'Количество заявок, отмеченных как отменённые - {}.'
else:
messages.warning(request, u'Недопустимое действие.')
return redirect('rqsttbl')
messages.success(request, msg.format(rows_updated))
return redirect('rqsttbl')
мой конфиг таблицы:
import django_tables2 as tables
class CheckBoxColumnWithValueInName(tables.CheckBoxColumn):
def render(self, value, bound_column): # pylint: disable=W0221
default = {
'type': 'checkbox',
'name': bound_column.name + str(value),
'value': value
}
general = self.attrs.get('input')
specific = self.attrs.get('td__input')
attrs = AttributeDict(default, **(specific or general or {}))
return mark_safe('<input %s/>' % attrs.as_html())
class SuRqstTblTable(tables.Table):
check_column = CheckBoxColumnWithValueInName(accessor='pk', orderable=False)
# еще нужные поля
class Meta:
empty_text = u'Объекты, удовлетворяющие критериям поиска, не найдены...'
model = RqstTbl
sequence = (блабла, бла,) # тут столбцы, выводимые в таблицу
exclude = tuple(
set(model._meta.get_all_field_names()) - set(sequence))
order_by = ('-id',)
# add class="paleblue" to <table> tag
attrs = {"class": "paleblue", "id": lambda: "table_%d" % next(counter)}
не уверен в оптимальности и правильности моего решения, но оно работает для меня.