Удаление задач с помощью фреймворка 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() не работает. Она не работает, потому что вы не вызываете эту функцию. Я предоставлю шаги, которые необходимо выполнить.
Проделайте следующее:
- Определите url для функции delete_task() в urls.py.
- В html сделайте кнопку для удаления задачи, в кнопке укажите url функции delete_task() и передайте task_id также вместе с url.
Надеюсь, вы поняли концепцию. Если у вас есть какие-либо сомнения, пожалуйста, дайте мне знать. Я не привел код, потому что если бы я его привел, вы могли бы просто скопировать и вставить его. Поэтому я дал вам способ сделать это самостоятельно.