Ошибка Нет URL для перенаправления. Либо укажите URL, либо определите метод get_absolute_url для модели

Я работаю над проектом django для создания футбольных тренировок. Я тестирую модель и ее сохранение. Проблема возникает, когда я пытаюсь сохранить ее, должно быть что-то с перенаправлением, потому что в базе данных тренировка действительно сохраняется, но она не перенаправляет меня никуда и выдает ошибку.

models.py

from django.db import models
from django.utils import timezone
from users.models import User


class Entrenamiento(models.Model):
    autor = models.ForeignKey(User, on_delete=models.CASCADE)
    idEntrenamiento = models.AutoField(primary_key=True)
    idEquipo = models.IntegerField()
    fecha = models.DateTimeField(default=timezone.now)
    idDireccionCampo = models.IntegerField()
    temporadas = [
        ('2022/2023','2022/2023'),
        ('2023/2024','2023/2024'),
        ('2024/2025','2024/2025'),
        ('2025/2026','2025/2026')
    ]
    temporada = models.CharField(max_length=50, choices=temporadas, default='2022/2023')

    def __str__(self):
        return 'Entrenamiento {}'.format(self.idEntrenamiento)

    @property
    def entreno(self):
       return 'Entrenamiento {} de {} para {} con fecha del {}, será en el campo {}'.format(self.idEntrenamiento, self.temporada, self.idEquipo, self.fecha, self.idDireccionCampo)

views.py

from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.models import User
from django.contrib import messages
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.views.generic import (CreateView, DeleteView, DetailView, ListView,UpdateView)
from django import forms
from django.urls import reverse_lazy

from .models import Entrenamiento


def home(request):
    context = {
        'entrenamientos': Entrenamiento.objects.all()
    }
    return render(request, 'entrenamientos/entrenamientos.html', context)

class PostListView(ListView):
    model = Entrenamiento
    template_name = 'entrenamientos/entrenamientos.html'#<app>/<model>_<viewtype>.html
    context_object_name = 'entrenamientos'
    ordering = ['-fecha']

class PostDetailView(DetailView):
    model = Entrenamiento

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Entrenamiento
    fields = ['autor','idEntrenamiento','idEquipo','idDireccionCampo','fecha']
    widgets = {'fecha': forms.DateInput(attrs={'type': 'date'})}


    def form_valid(self,form):
        form.instance.autor = self.request.user
        return super().form_valid(form)

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Entrenamiento
    fields = ['autor','idEntrenamiento','idEquipo']

    def form_valid(self,form):
        form.instance.autor = self.request.user
        return super().form_valid(form)

    def test_func(self):
        entrenamiento = self.get_object()
        if self.request.user == entrenamiento.autor:
            return True
        return False

class PostDeleteView(DeleteView):
    model = Entrenamiento
    success_url = '/'

    def test_func(self):
        entrenamiento = self.get_object()
        if self.request.user == entrenamiento.autor:
            return True
        return False

urls.py

    from django.urls import path
    from .views import PostListView, PostDetailView, PostCreateView, PostUpdateView, PostDeleteView
    from django.contrib.auth.decorators import login_required
    
    app_name = 'entrenamientos'
    
    urlpatterns = [
        path('', login_required(PostListView.as_view()), name='entrenamientos'),
        path('entrenamiento/<int:pk>/',login_required( PostDetailView.as_view()), name='entrenamiento-detail'),
        path('entrenamiento/new/',login_required( PostCreateView.as_view()), name='entrenamiento-create'),
        path('entrenamiento/<int:pk>/update/',login_required( PostUpdateView.as_view()), name='entrenamiento-update'),
        path('entrenamiento/<int:pk>/delete/',login_required( PostDeleteView.as_view()), name='entrenamiento-delete'),
        path('entrenamiento', login_required(PostListView.as_view()), name='entrenamientos')
    ]

Ошибка:

Неправильная конфигурация в /entrenamientos/entrenamiento/new/ Нет URL для перенаправления. Либо укажите URL, либо определите метод get_absolute_url в модели.

Я думаю, что что-то не так с: def form_valid(self,form):

Я пробовал добавить это в def form_valid, но появляется другая ошибка

    # success_url = reverse_lazy('entrenamiento')
    # success_message = 'Entrenamiento añadido'

Я надеюсь, что решение

Вам необходимо обеспечить success_url внутри представления вашего класса. Вы можете сделать это одним из вариантов, но для данной задачи достаточно первого:

class PostCreateView(LoginRequiredMixin, CreateView):
    ...
    success_url = reverse_lazy('entrenamientos:entrenamientos')

    # OR
    def get_success_url(self):
        return reverse_lazy('entrenamientos:entrenamientos')

Также посмотрите на свои урлы:

urlpatterns = [
    path('', login_required(PostListView.as_view()), name='entrenamientos'),
    ...
    path('entrenamiento', login_required(PostListView.as_view()), name='entrenamientos')
]

Вы задали два URL с одинаковыми именами. Так делать не следует. Первый всегда будет отображаться с помощью тега {% url %}. Нужен ли вам вообще второй?

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