如何在Django模板表单中正确渲染Model层定义的Choice选择字段
问题原因
- 混淆了Django模型(Model)和表单(Form)的概念,直接用模型类实例化表单对象是无效操作
- 传递给模板的
ttile变量是Author模型的全部数据实例,而非你定义的TITLE_CHOICES选项列表,若数据库内暂无Author数据,循环自然没有内容输出 - 模板内
<option>的value属性写死为固定值,没有使用选项的实际存储值,渲染的内容也是整个模型实例而非选项的显示文本 - 表单校验通过后直接返回渲染页面,没有携带上下文,操作后也会出现选项丢失的问题
修正方案
1. 新增表单定义(在app目录下新建forms.py)
from django.forms import ModelForm from .models import Author class AuthorForm(ModelForm): class Meta: model = Author fields = ['title']
2. 修正views.py逻辑
from .forms import AuthorForm def AuthorView(request): form = AuthorForm(request.POST or None) # 直接传递定义好的选项列表到模板 context = { "form": form, "title_choices": Author.TITLE_CHOICES, } if form.is_valid(): form.save() # 保存后也要携带上下文返回,不要省略context return render(request, 'index.html', context) return render(request, 'index.html', context)
3. 修正index.html模板代码
如果你想用手动渲染的方式,修改select部分为:
<select name="title" id="confirm_type"> {% for val, display in title_choices %} <option value="{{ val }}"> {{ display }} </option> {% endfor %} </select>
如果想要更简单的方式,直接用Django表单自动渲染字段,不需要手动写循环:
<!-- 直接输出整个表单字段,自带下拉选项 --> {{ form.title }}
内容的提问来源于stack exchange,提问作者Prosenjit
相关产品推荐
相关产品推荐

