Django_tables2 с кнопками «Редактировать» и «Удалить».Как это сделать правильно? - PullRequest
2 голосов
/ 16 апреля 2019

Я создаю приложение, которое перечисляет, сортирует, обновляет и удаляет объекты. Как правильно добавить кнопки редактирования и / или удаления в рендер таблицы django-tables2?

Версия Python: 3.7 и версия Django: 2.1.7.

Я пробовал несколько способов и искал в интернете, но кажется немного сложным реализовать его с помощью рендеринга таблиц django-tables2.

Вот мой код.

byauthor.html - таблица отображается в этом html

{% extends "main/base.html" %}

{% block content %}

{% load render_table from django_tables2 %}

            <h3>Logged in: {{user.first_name}} {{user.last_name}} </h3>
            <p>{{ time|date:"d.m.Y." }}</p>

            {% render_table table %}

{% endblock %}

views.py

def byauthor(request):
    current_account = request.user

    items = Cashier.objects.filter(user__exact=current_account).filter(cashier_published__date=datetime.today())
    table = CashierTable(Cashier.objects.filter(user__exact=current_account).filter(cashier_published__date=datetime.today()))

    RequestConfig(request).configure(table)

    return render(request, 'main/byauthor.html', {'table': table, 'time': datetime.now(), 'items': items})

def delete_item(request, pk):

    Cashier.objects.filter(id=pk).delete()

    items = Cashier.objects.all()

    context = {
    'items': items
    }

    return render(request, 'main/delete_confirmation.html', context)

urls.py

from django.urls import path
from . import views


app_name = 'main'  # here for namespacing of urls.

urlpatterns = [
    path("", views.homepage, name="homepage"),
    path("byauthor", views.byauthor, name="byauthor"),
    path('byauthor/delete_item/<int:pk>', views.delete_item, name="delete_item"),
]

Здесь я добавил столбец к модели таблицы.

tables.py

class CashierTable(tables.Table):
    delete = tables.TemplateColumn(template_name='main/delete_template.html', orderable=False)

    class Meta:
        model = Cashier
        order_by = '-id'

А вот основная проблема .

delete_template.html

{% for item in items %}
    <a href="{% url 'main:delete_item' item.pk %}" type="submit" class="btn"><button>{{ item.id }}</button></a>
{% endfor %}

Когда моя таблица обрабатывается, она явно перебирает объекты, для которых генерирует новую строку, и это нормально. Но когда я отображаю его с помощью delete_template.html, представляющего кнопку для удаления определенного объекта, он снова выполняет итерации по объектам и генерирует кнопки для всех объектов в каждой строке. Так что, если у меня есть 10 объектов, он генерирует 10 кнопок удаления для каждой строки.

Но если я удаляю этот цикл {% for%} в delete_template.html , это выдает эту ошибку:

NoReverseMatch at /byauthor
Reverse for 'delete_item' with arguments '('',)' not found. 1 pattern(s) tried: ['byauthor/delete_item/(?P<pk>[0-9]+)$']

Любая помощь или советы будут оценены.

Функциональность хорошая, работает. Удаляет объект с этим идентификатором.

Моя цель - сгенерировать одну кнопку для каждого объекта (строки), в котором есть идентификатор объекта, чтобы я мог переслать его для удаления, щелкнув по нему.

1 Ответ

2 голосов
/ 16 апреля 2019

Я думаю, вы можете использовать LinkColumn , чтобы добавить кнопку удаления. Вы можете сделать это так:

from django_tables2.utils import A  # alias for Accessor


class CashierTable(tables.Table):
    delete = = tables.LinkColumn('main:delete_item', args=[A('pk')], attrs={
    'a': {'class': 'btn'}
    })
...