Удаление задач с помощью фреймворка Django

В настоящее время я создаю проект списка дел, используя веб-фреймворк Django, и у меня возникла проблема с удалением задач с веб-страницы. Моя проблема заключается в том, что я не знаю и не могу найти подходящий код для выполнения действия по удалению задачи с веб-страницы. Вот как выглядит веб-страница: todo list.

Я считаю, что моя проблема содержится в файле views.py:

from django.shortcuts import render, redirect
from django.contrib import messages as django_messages
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from .forms import RegisterForm, CreateTask
from .models import Task  # Import Task model

def home(request):
    if request.method == 'POST':
        form = CreateTask(request.POST)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = CreateTask()
    
    tasks = Task.objects.all().order_by('-created_at')[:10]  # Query Task model correctly
    context = {
        'form': form,
        'tasks': tasks,
    }
    return render(request, "home.html", context)

def delete_task(request, id):
    task = Task.objects.get(id=id)
    task.delete()
    return redirect('home')

@login_required
def user_logout(request):
    auth_logout(request)
    django_messages.success(request, 'Logged out successfully')
    return redirect("introduction")  # Redirect to a valid URL name

def user_login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(request, username=username, password=password)

        if user is not None:
            auth_login(request, user)
            django_messages.success(request, 'Login successful')
            return redirect('home')  # Replace 'index' with your actual URL name
        else:
            django_messages.error(request, 'Login failed')
    return render(request, "login.html")

def register(request):
    if request.method == "POST":
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            django_messages.success(request, 'Registration successful')
            return redirect('home')  # Replace 'index' with your actual URL name
    else:
        form = RegisterForm()
    return render(request, 'register.html', {'form': form})

@login_required
def delete_user(request, username):
    try:
        u = User.objects.get(username=username)
        u.delete()
        django_messages.success(request, "User is deleted")
    except User.DoesNotExist:
        django_messages.error(request, "User doesn't exist")
    except Exception as e:
        django_messages.error(request, f"Error deleting user: {e}")
    return redirect("introduction")  # Redirect to a valid URL name

def introduction(request):
    return render(request, 'introduction.html')

Вот файлы, которые я также использовал для создания проекта

models.py:

from django.db import models

class Task(models.Model):
    subject = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now_add=True)
    description = models.CharField(max_length=50)

    class Meta:
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.subject} - ({self.created_at})"`

forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Task

class RegisterForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class CreateTask(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['subject', 'description']

urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path("login/", views.user_login, name="login"),
    path("logout/", views.user_logout, name="logout"),
    path("introduction/", views.introduction, name="introduction"),
    path("register/", views.register, name="register"),
    path("delete-user/<str:username>", views.delete_user, name="delete-user")
]

home.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Todo List</title>
</head>
<body>
    <div class="container">
        <h1>Todo List</h1>
        <form method="post">
            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">Post Task</button>
        </form>
        <ul>
            {% for task in tasks %}
                <li>{{ task.subject }} - {{ task.description }} (Created at: {{ task.created_at }})</li>
            {% empty %}
                <li>No tasks available</li>
            {% endfor %}
        </ul>
        <div class="user-settings">
            {% if user.is_authenticated %}
                <a class="link-logout" href="{% url 'logout' %}">Logout</a>
                <a class="link-delete" href="{% url 'delete-user' username=user.username %}">Delete Account</a>
            {% else %}
                <a class="link-login" href="{% url 'login' %}">Login</a>
            {% endif %}
        </div>
    </div>
</body>
</html>

Код, который я пробовал в файле views.py для удаления задач, был следующим:

def delete_task(request, id):
    task = Task.objects.get(id=id)
    task.delete()
    return redirect('home')

Но этот код не сработал, поэтому сейчас я бьюсь над тем, какой код мне написать, чтобы правильно удалять задания с веб-страницы. Есть ли у кого-нибудь предложения, советы, примеры кода или решения, которые могут решить эту проблему?

Проблема, о которой вы упомянули, заключается в том, что функция delete_task() не работает. Она не работает, потому что вы не вызываете эту функцию. Я предоставлю шаги, которые необходимо выполнить.

Проделайте следующее:

  1. Определите url для функции delete_task() в urls.py.
  2. В html сделайте кнопку для удаления задачи, в кнопке укажите url функции delete_task() и передайте task_id также вместе с url.

Надеюсь, вы поняли концепцию. Если у вас есть какие-либо сомнения, пожалуйста, дайте мне знать. Я не привел код, потому что если бы я его привел, вы могли бы просто скопировать и вставить его. Поэтому я дал вам способ сделать это самостоятельно.

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