点击Django更新URL跳转至新建页面问题求助(续Stack Overflow帖)
这种情况我之前踩过坑,大概率是你的UpdateView没正确获取到要更新的对象实例,导致它默认走了创建新对象的逻辑。咱们一步步来排查:
1. 先检查URL配置是否传递了对象PK
UpdateView默认依靠URL里的pk或slug参数来定位要编辑的对象,这是最容易出错的点。
- 你的URL配置应该是类似这样的:
path('question/update/<int:pk>/', QuestionUpdateView.as_view(), name='question-update'), - 模板里的更新链接必须带上对应问题的PK:
<a href="{% url 'question-update' question.pk %}">编辑这个问题</a>
如果URL里没传pk,UpdateView找不到目标对象,就会自动渲染一个空表单,看起来和新建页面一模一样。
2. 确认UpdateView类的配置是否正确
检查你的视图类有没有写错:
from django.views.generic.edit import UpdateView from .models import Question class QuestionUpdateView(UpdateView): model = Question fields = ['title', 'content'] # 要允许更新的字段 template_name = 'question_form.html' success_url = reverse_lazy('question-list') # 编辑完成后跳转的页面
- 别不小心继承成
CreateView了! - 如果自定义了
get_queryset,要确保它能返回当前用户有权编辑的对象,不然也会导致找不到实例而触发新建逻辑。
3. 让模板区分“新建”和“编辑”场景
你的模板question_form.html现在固定显示“Create New Question”,可以改成动态判断:
{% extends "base.html" %} {% load bootstrap3 %} {% block content %} <h4>{% if object %}编辑问题{% else %}创建新问题{% endif %}</h4> {% bootstrap_form form %} <!-- 其他表单提交按钮等内容 --> {% endblock %}
UpdateView会把要编辑的对象以object变量传给模板,而CreateView里没有这个变量,这样就能直观区分两种场景了。
4. 调试get_object方法确认实例是否被获取
可以在UpdateView里临时加个调试方法,看看有没有正确拿到对象:
def get_object(self, queryset=None): obj = super().get_object(queryset) print(f"当前编辑的问题ID: {obj.pk}") # 看控制台输出是否正确 return obj
如果控制台没输出,说明完全没获取到对象,那就要回头检查URL的pk参数是不是没传对,或者用户权限设置有没有过滤掉目标对象。
如果上面的排查还没解决问题,可以把你的URL配置和完整视图类代码贴出来,我再帮你细抠细节~
内容的提问来源于stack exchange,提问作者Cflux
相关产品推荐
相关产品推荐

