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>
Примечание: Вы можете ограничить представления на основе классов для аутентифицированных пользователей с помощью
LoginRequiredMixinmixin [Django-doc].