You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:48:05