Django模板内表单仅显示提交按钮不渲染字段问题求助
Django表单仅显示提交按钮无输入字段问题解决
问题根因
问题出在views.py的视图逻辑错误,具体如下:
- 表单初始化逻辑不合理:不管GET/POST请求,都直接将
request.POST传给表单构造器。GET请求时request.POST是空对象,此时表单会处于绑定空数据的状态,又没有触发校验流程,无法正常渲染字段。 - 空表单初始化分支位置错误:空表单
form = PostForm()的赋值逻辑放在了「POST请求且表单校验失败」的分支下,GET请求完全无法进入该分支,模板拿到的不是正常的未绑定空表单。
此外你的代码还有两处不影响表单渲染但会导致后续逻辑出错的问题:
posts = Post.objects.all缺少调用括号,会导致模板遍历文章列表时报错- 保存表单时赋值作者的逻辑错误,
form.save(commit=False)返回的是模型实例,需要给实例而非form对象赋值auther属性
修复方案
直接替换views.py中的post_list视图代码即可:
from post.models import Post from django.shortcuts import redirect, render from . forms import PostForm def post_list(request): # 修复查询方法缺少括号的问题 posts = Post.objects.all() # 仅POST请求绑定提交数据,GET请求初始化空表单 if request.method == "POST": form = PostForm(request.POST) if form.is_valid(): # 修复作者赋值逻辑,拿到模型实例再赋值 post = form.save(commit=False) post.auther = request.user post.save() return redirect("/") else: # GET请求走该分支,生成未绑定的空表单用于渲染 form = PostForm() context = { "posts": posts, "form": form, } return render(request, 'index.html', context)
可选优化
如果不需要用户在表单中选择作者,可以在forms.py的PostForm中排除auther字段,避免用户恶意提交其他用户ID:
class PostForm(forms.ModelForm): class Meta: model = Post fields='__all__' exclude = ('auther',)
另外你forms.py中重复导入了from django import forms,可以删除冗余的导入语句。
内容的提问来源于stack exchange,提问作者MOUHAMED FARDOUSI
相关产品推荐
相关产品推荐

