Ошибка Нет 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 %}
. Нужен ли вам вообще второй?