django - 成功后如何重定向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?它可以是项目列表或项目更新视图,只要它有效。
解决方案
reverse / reverse_lazy 用于使用视图名称或模式名称获取 url。如果您想直接使用 url,只需编写:
success_url = '/'
对于return reverse("update", kwargs={"pk": pk})
您设置后无法正常工作的情况,app_name = 'reqs'
您应该使用它return reverse("reqs:update", kwargs={"pk": pk})
。
推荐阅读
- language-agnostic - Codility CyclicRotation 就地实施
- excel - Excel:检查值是否出现在几张纸之一上
- python - 在python中随机连接两个数组直到满足限制长度
- php - php -m 的可靠性如何。我可以用它来检查所有已安装的 php 扩展吗?
- nosql - 使用单表的 NoSQL 数据库设计
- excel - 通过 VBA 自动筛选时如何跳过字段?
- ios - Xcode 构建上传错误:对 TCP 端口 443 的出站访问,无法找到包的 MZContentProviderUpload。(1041)
- node.js - 节点 js 和猫鼬模式 date.now 代码无法正常工作
- mysql - mySQL 5.5 - 在与 UNION 链接的两个表之后将值透视到列
- jenkins - 如何访问 Jenkins ${workspace}/ 中的子目录?