Django基于函数的更新视图不加载已有数据,无报错仅显示空白表单
问题原因与修复方案
1. 视图逻辑错误
你的post对象查询代码仅放在了POST请求分支内,首次访问编辑页(GET请求)走到else分支时,post变量未定义,同时GET请求时传入了空的request.POST/request.FILES,覆盖了实例原有数据,导致表单空白。
2. 编辑入口请求方式错误
你当前的编辑按钮是用POST方式提交请求到编辑接口,此时没有携带任何表单字段数据,表单校验失败后会返回空白表单。
3. 编辑页模板需补全字段渲染
你贴出的模板是列表页的编辑入口代码,编辑页edit_post.html需要单独渲染表单字段,否则也会显示空白。
修正后的代码
views.py
@login_required def editPost(request, slug): # 公共逻辑:无论GET/POST都先查询要编辑的文章对象 post = get_object_or_404(Post, slug=slug) if request.method == 'POST': form = PostForm(request.POST, request.FILES, instance=post) if form.is_valid(): # 用commit=False先修改附加字段再保存 post = form.save(commit=False) post.author = request.user.username post.updated = True post.save() return redirect('dashboard') else: # GET请求仅传入实例,加载原有数据 form = PostForm(instance=post) return render(request, 'edit_post.html', {'form': form, 'post': post})
列表页编辑入口(替换原来的表单)
<a class="btn btn-sm dropdown-item" href="{% url 'edit' slug=post.slug %}">Edit</a>
edit_post.html 编辑页模板
<!-- 如果有文件上传字段必须加enctype属性 --> <form method="post" enctype="multipart/form-data"> {% csrf_token %} <!-- 渲染表单字段,可以用as_p/as_ul/as_table,也可以自定义每个字段的样式 --> {{ form.as_p }} <button type="submit">保存修改</button> </form>
内容的提问来源于stack exchange,提问作者sam hassan
相关产品推荐
相关产品推荐

