首页 > 解决方案 > 成功后如何重定向UpdateView?

问题描述

我创建了一个小型 Django 应用程序来管理适合简单模型的数据。现在我只需要两个视图:一个列出所有记录,另一个用通用表单编辑记录。一切都按预期运行,除了在成功更新时从编辑视图重定向。里面有urls.py以下内容:

from django.urls import path
from . import views

app_name = 'reqs'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.ReqUpdateView.as_view(), name='update'),
]

forms.py

from django.forms import ModelForm
from .models import Requirement


class RequirementForm(ModelForm):
    class Meta:
        model = Requirement
        fields = ['name', 'priority', 'source' , 'rationale']

和寺庙requirement_form.html

<h1>{{ requirement.id }} - {{ requirement.name }}</h1>

<form method="post" novalidate>
  {% csrf_token %}
    <table>
    {{ form.as_table }}
    <tr><td></td><td><button type="submit">Save</button></td></tr>
    </table>
</form>
    
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<br><br>
<a href="{% url 'reqs:index' %}">Back to list</a>

最后views.py,在第一次尝试将更新重定向到列表时:

from django.views.generic import ListView, UpdateView
from django.urls import reverse_lazy
from .models import Requirement
from .forms import RequirementForm

class IndexView(ListView):
    template_name = 'reqs/index.html'
    context_object_name = 'requirements_list'

    def get_queryset(self):
        return Requirement.objects.order_by('subject')

class ReqUpdateView(UpdateView):
    model = Requirement
    form_class = RequirementForm
    success_url = reverse_lazy('/')

使用此公式,保存按钮会产生此错误:

未找到“/”的反向。'/' 不是有效的视图函数或模式名称。

我还尝试了一个空字符串作为 的参数reverse_lazy,以及路径名index,但产生了类似的错误消息。

在第二次尝试中,我尝试重定向到同一页面,重新定义get_success_url方法以不执行任何操作:

class ReqUpdateView(UpdateView):
    model = Requirement
    form_class = RequirementForm
    context_object_name = 'requirement_update'
    def get_success_url(self):
        pass #return the appropriate success url

这会返回一个 404 错误,试图将浏览器重定向到/reqs/1/None.

第三次尝试重定向到具有相同记录的表单:

class ReqUpdateView(UpdateView):
    model = Requirement
    form_class = RequirementForm
    context_object_name = 'requirement_update'
    def get_success_url(self):
           pk = self.kwargs["pk"]
           return reverse("update", kwargs={"pk": pk})

抱怨找不到视图:

未找到“更新”的反向。'update' 不是有效的视图函数或模式名称。

如何将成功重定向到有效的 URL?它可以是项目列表或项目更新视图,只要它有效。

标签: djangodjango-views

解决方案


reverse / reverse_lazy 用于使用视图名称或模式名称获取 url。如果您想直接使用 url,只需编写:

success_url = '/'

对于return reverse("update", kwargs={"pk": pk})您设置后无法正常工作的情况,app_name = 'reqs'您应该使用它return reverse("reqs:update", kwargs={"pk": pk})


推荐阅读