Django - кнопка для удаления строки в sqlite3

У меня вопрос... У меня есть Django приложение с почтовым ящиком, который показывает список со всеми письмами и их важность (приоритет ответа). нажатие на кнопку "Manage" переходит к просмотру почтового сообщения.

Теперь я также хочу добавить кнопку "удалить", которая удалит это письмо в списке, а также строку из базы данных sqlite3.

Я пробовал множество вещей, потому что я видел это на нескольких форумах. Моя проблема в том, что я совсем новичок в Django и не знаю, какие ответы я могу совместить с тем, что уже есть в моем коде

Вот что у меня есть сейчас (это не работает, так как я все еще пытаюсь найти рабочие решения)

mailindex.html:

        <tbody>
        {% for mail in mails %}
            {% if not mail.sent %}
                {% if not mail.importance.baseSeverity == "LOW" and not mail.importance.baseSeverity == "MEDIUM" %}
                <tr {% if mail.importance.baseSeverity == "CRITICAL" %} class="bg-red" {% endif %}{% if mail.importance.baseSeverity == "HIGH" %}class="bg-yellow" {% endif %}>
                    <td><a href="{% url 'core:mail' mail.id %}" class="text-inherit">{{ mail.importance.baseSeverity }}</a></td>
                    <td>{{ mail.importance.level }}</td>
                    <td>{{ mail.importance.mails.all.count }}
                    </td>
                    <td>
                        {{ mail.importance.lastModifiedDate }}
                    </td>
                    <td class="text-right">
                        <a href="{% url 'core:mail' mail.id %}" class="btn btn-secondary btn-sm">Manage</a>
                        <form  method='POST' action='delete'>
                            <input type=hidden name='delete' value='{{mail.id}}'>
                            <button type="submit" class="btn btn-secondary btn-sm">Delete</button>
                        </form>
                    </td>
                </tr>
                {% endif %}
            {% endif %}
        {% endfor %}
        </tbody>

views.py

class MailboxView(generic.ListView):
    extra_context = {"mailbox_page": "active"}
    model = MailMessage
    context_object_name = 'mails'
    template_name = 'core/mailbox/mailindex.html'

    def delete_mail_listing(self):
        if 'delete' in self.request.POST:
            record = MailMessage.objects.get(id=self.mail.id)
            record.delete()

urls.py

urlpatterns = [
    path('', login_required(views.IndexView.as_view()), name='index'),
    path('mailbox', login_required(views.MailboxView.as_view()), name='mailbox'),
    path('delete', login_required(views.MailboxView.as_view()), name='mailbox')]

Таблица как в sqlite3 (я создал столбец deletedFromOverview, так как он может быть полезен, чтобы не показывать строку)

CREATE TABLE "core_mailmessage" (
    "id"    integer NOT NULL,
    "sent"  bool NOT NULL,
    "deletedFromOverview"   bool NOT NULL DEFAULT 'False',
    "body"  text NOT NULL,
    "importance_id" integer NOT NULL,
    "subject"   text NOT NULL,
    "replyTo"   varchar(254) NOT NULL,
    FOREIGN KEY("importance_id") REFERENCES "core_importance"("id") DEFERRABLE INITIALLY DEFERRED,
    PRIMARY KEY("id" AUTOINCREMENT)
);

Django не будет запускать delete_mail_listing или любой другой метод, кроме тех, которые находятся в потоке кода ListView.

Вероятно, самым элегантным способом сделать это является работа с DeleteView:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import DeleteView

class MailMessageDeleteView(LoginRequired, DeleteView):
    model = MailMessage
    success_url = reverse_lazy('mailbox')

В urls.py можно зарегистрировать следующее представление:

urlpatterns = [
    path('', login_required(views.IndexView.as_view()), name='index'),
    path('mailbox', login_required(views.MailboxView.as_view()), name='mailbox'),
    path('mailbox/delete/<int:pk>/', views.MailMessageDeleteView.as_view(), name='delete')
]

и в шаблоне, который вы затем отправляете на MailMessageDeleteView:

<form  method="POST" action="{% url 'delete' pk=mail.pk %}">
    {% csrf_token %}
    <button type="submit" class="btn btn-secondary btn-sm">Delete</button>
</form>

Примечание: Вы можете ограничить представления на основе классов для аутентифицированных пользователей с помощью LoginRequiredMixin mixin [Django-doc].

Вернуться на верх