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

使用get_foo_display无法输出完整值?Django表单问题求助

解决方案:Django表单提交后显示选项完整文本

你的问题核心是**form_data是普通字典,没有get_sex_display()方法**——这个方法是Django表单/模型实例特有的,而你把request.POST转成字典后,就丢失了表单实例的方法和属性。下面是两种简单可行的解决办法:

方法一:直接使用验证后的表单实例(推荐)

不用单独存form_data,直接利用验证通过的表单实例来获取显示文本和字段值:

修改views.py

def pool(request):
    assert isinstance(request, HttpRequest)
    context = {'title': 'Обратная связь'}  # 补全context初始化,避免报错

    if request.method == 'GET':
        form = FeedbackForm()
    else:
        form = FeedbackForm(request.POST)
        if form.is_valid():
            # 验证通过后无需额外存数据,直接保留表单实例即可
            pass  # 这里可添加数据保存等业务逻辑

    context['form'] = form
    return render(request, 'app/pool.html', context=context)

修改pool.html

通过表单实例访问cleaned_data获取字段值,用get_sex_display()获取性别显示文本:

{% if form.is_valid %}
    <p><b>Ваше имя:</b> {{ form.cleaned_data.name }}</p>
    <p><b>Ваш пол:</b> {{ form.get_sex_display }}</p>
{% endif %}
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

方法二:手动映射选项文本到字典

如果一定要用form_data字典存储数据,可以手动从表单的选项中映射出显示文本:

修改views.py

def pool(request):
    assert isinstance(request, HttpRequest)
    context = {'title': 'Обратная связь'}

    if request.method == 'GET':
        form = FeedbackForm()
    else:
        form = FeedbackForm(request.POST)
        if form.is_valid():
            form_data = form.cleaned_data  # 用验证后的cleaned_data更安全
            # 从表单的SEX_OPTIONS创建映射字典
            sex_map = dict(FeedbackForm.SEX_OPTIONS)
            # 把性别显示文本加入字典
            form_data['sex_display'] = sex_map[form_data['sex']]
            context['form_data'] = form_data

    context['form'] = form
    return render(request, 'app/pool.html', context=context)

修改pool.html

{% if form_data %}
    <p><b>Ваше имя:</b> {{ form_data.name }}</p>
    <p><b>Ваш пол:</b> {{ form_data.sex_display }}</p>
{% endif %}
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

补充说明

  • 优先选择方法一,Django表单实例已封装所有验证后的数据和方法,无需手动处理映射,更简洁安全。
  • 原代码中context未初始化,需先定义context = {...},否则会触发变量未定义错误。

内容的提问来源于stack exchange,提问作者Shurik Mikhailov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:15:22