Django足球训练项目保存时无重定向URL报错求助
问题:Django训练数据保存后无法重定向,抛出ImproperlyConfigured错误
训练数据已成功存入数据库,但保存后页面无法重定向,抛出如下错误:
ImproperlyConfigured at /entrenamientos/entrenamiento/new/
No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model
尝试添加success_url但出现其他错误,相关代码如下:
相关代码
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') ]
之前尝试的错误代码:
# success_url = reverse_lazy('entrenamiento') # success_message = 'Entrenamiento añadido'
解决方案
方案一:给模型添加get_absolute_url方法
在Entrenamiento模型中添加该方法,指定对象的详情页URL,这样CreateView/UpdateView默认会重定向到该对象的详情页:
from django.urls import reverse class Entrenamiento(models.Model): # 现有字段和方法保持不变 def get_absolute_url(self): # 利用app_name和URL名称反向解析 return reverse('entrenamientos:entrenamiento-detail', kwargs={'pk': self.pk})
方案二:在CreateView中正确配置success_url
你之前的错误是URL名称使用错误,应该使用项目中已定义的URL名称(比如列表页的entrenamientos)。同时建议移除fields中不需要用户输入的字段:
class PostCreateView(LoginRequiredMixin, CreateView): model = Entrenamiento # 移除autor(已自动设置)和idEntrenamiento(AutoField自动生成) fields = ['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) # 重定向到训练列表页 success_url = reverse_lazy('entrenamientos:entrenamientos') # 可选:如果要重定向到新建训练的详情页,用以下代码代替success_url # def get_success_url(self): # return reverse('entrenamientos:entrenamiento-detail', kwargs={'pk': self.object.pk})
另外,PostUpdateView也存在同样的问题,建议同样添加success_url或者给模型加get_absolute_url,避免更新后也出现重定向错误。
内容的提问来源于stack exchange,提问作者Chema Torices
相关产品推荐
相关产品推荐

