Reverse for 'about' not found. 'about' is not a valid view function or pattern name
views.py
from django.shortcuts import render, redirect, reverse
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView, View
from .forms import ContactForm
from todo import settings
from django.http import HttpResponse
from django.core.mail import send_mail, BadHeaderError
from django.urls import reverse_lazy
from django.contrib.auth.views import LoginView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
from .models import Task
class CustomLoginView(LoginView):
template_name = 'base/login.html'
fields = '__all__'
redirect_authenticated_user = True
def get_success_url(self):
return reverse_lazy('tasks')
class RegisterPage(FormView):
template_name = 'base/register.html'
form_class = UserCreationForm
redirect_authenticated_user = True
success_url = reverse_lazy('tasks')
def form_valid(self, form):
user = form.save()
if user is not None:
login(self.request, user)
return super(RegisterPage, self).form_valid(form)
def get(self, *args, **kwargs):
if self.request.user.is_authenticated:
return redirect('tasks')
return super(RegisterPage, self).get(*args, **kwargs)
class TaskList(LoginRequiredMixin, ListView):
model = Task
context_object_name = 'tasks'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['tasks'] = context['tasks'].filter(user=self.request.user)
context['count'] = context['tasks'].filter(complete=False).count()
context['k'] = context['tasks'].filter(complete=True).count()
search_input = self.request.GET.get('search-area') or ''
if search_input:
context['tasks'] = context['tasks'].filter(title__startswith=search_input)
context['search_input'] = search_input
return context
class TaskDetail(LoginRequiredMixin, DetailView):
model = Task
context_object_name = 'task'
template_name = 'base/task.html'
class TaskCreate(LoginRequiredMixin, CreateView):
model = Task
fields = ['title', 'description','complete']
success_url = reverse_lazy('tasks')
def form_valid(self, form):
form.instance.user = self.request.user
return super(TaskCreate, self).form_valid(form)
class TaskUpdate(LoginRequiredMixin, UpdateView):
model = Task
fields = ['title', 'description', 'complete']
success_url = reverse_lazy('tasks')
class DeleteView(LoginRequiredMixin, DeleteView):
model = Task
context_object_name = 'task'
success_url = reverse_lazy('tasks')
class About(ListView):
model= Task
template_name = 'base/about.html'
def homepage(request):
return render(request, "base/task_list.html")
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
subject = "Пробное сообщение"
body = {
'first_name': form.cleaned_data['first_name'],
'last_name': form.cleaned_data['last_name'],
'email': form.cleaned_data['email_address'],
'message': form.cleaned_data['message'],
}
message = "\n".join(body.values())
try:
send_mail(subject, message,
'admin@example.com',
['admin@example.com'])
except BadHeaderError:
return HttpResponse('Найден некорректный заголовок')
form = ContactForm()
return render(request, "base/contact.html", {'form': form})
urls
from django.urls import path
from .views import TaskList, TaskDetail, TaskCreate, TaskUpdate, DeleteView, CustomLoginView, RegisterPage, About
from django.views.generic import TemplateView
from django.contrib.auth.views import LogoutView
from . import views
from django.conf.urls import url
app_name = 'base'
urlpatterns = [
path('login/', CustomLoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(next_page='login'), name='logout'),
path('register/', RegisterPage.as_view(), name='register'),
path('', TaskList.as_view(), name ='tasks'),
path('task/<int:pk>/', TaskDetail.as_view(), name ='task'),
path('task-create/', TaskCreate.as_view(), name ='task-create'),
path('task-update/<int:pk>/', TaskUpdate.as_view(), name ='task-update'),
path('task-delete/<int:pk>/', DeleteView.as_view(), name ='task-delete'),
path('about/', About.as_view(), name='about'),
path('contact/', views.contact, name='contact'),
]
contact.html
<!--Contact form-->
{% extends 'base/main.html' %}
{% block content %}
<div class="header-bar">
<a href="{% url 'tasks' %}">← Back</a>
</div>
<body>
<p>Write us if you have any questions</p>
<p>
Please, write your name, email address and message</p>
<div class="card-body">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</div>
</body>
{% endblock content %}
about.html
{% extends 'base/main.html' %}
{% block content %}
<div class="header-bar">
<a href="{% url 'tasks' %}">← Back</a>
</div>
<body>
<p><h3>This app was created for you to keep your busy life in order!</h3>
</p>
<p><h3>Just make a list with your daily tasks in a blink of an eye without any difficulties!</h3></p>
<p><h5>Created with Python 3.0, Django 3, HTML and CSS</h5></p>
</body>
{% endblock content %}
В общем выкидывает ошибку Reverse for 'about' not found. 'about' is not a valid view function or pattern name. Как исправить? в чем пролема?