Django Can';不要在表单中使用get\u FOO\u display

Django Can';不要在表单中使用get\u FOO\u display,django,Django,嗨,我只想在模板中显示表单中选择字段的可读文本。问题是模板没有显示任何内容。我做错了什么?代码如下。谢谢 forms.py class MathsForm(forms.Form): operation_choices = [ (0, None), (1, 'Addition'), (2, 'Subtration'), (3, 'Times'), (4, 'Division') ] oper

嗨,我只想在模板中显示表单中选择字段的可读文本。问题是模板没有显示任何内容。我做错了什么?代码如下。谢谢

forms.py

class MathsForm(forms.Form):

    operation_choices = [
        (0, None),
        (1, 'Addition'),
        (2, 'Subtration'),
        (3, 'Times'),
        (4, 'Division')
    ]

    operation = forms.ChoiceField(choices=operation_choices, help_text="(required)")
views.py

def maths(request):
    if request.method == 'POST':
        form = MathsForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            return render(request, 'maths/test.html', {'cd': cd})
    else:
        form = MathsForm(
            initial={'operation': 1}
        )
    return render(request, 'maths/maths.html', {'form': form})
模板-math.html

{{ cd.get_operation_display }}

您必须在模型字段上使用
get\u operation\u display

您似乎试图在表单的
cleaned_data
dict上使用它

我认为表单字段不存在
get\u FOO\u display
方法

此SO答案详细说明了一个自定义模板过滤器,该过滤器将为您提供表单字段当前所选选项的“显示”值:

您可以在views.py中传递所选操作本身,而不是将清理后的数据作为cd传递:

def maths(request):
    if request.method == 'POST':
        form = MathsForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            op_dict = dict(form.fields['operation'].choices)
            op = op_dict[int(cd['operation'])]
            return render(request, 'maths/test.html', {'op': op})
    else:
        form = MathsForm(
            initial={'operation': 1}
        )
    return render(request, 'maths/maths.html', {'form': form})

好的,那么它只适用于Django模型。我想是这样的。我试图实现你链接到的内容,但没有成功。上述答案只返回0,1,2 Django存储的数据,而不是人类可读的文本。谢谢。
{{form.operation}
返回了
1
?我认为这可能是一个类型铸造问题。。。选项键是
int
s,但字段数据可能是
str
。请尝试相应地修改筛选器,谢谢。我修改了代码,似乎对表单实例有效。但是,如果调用表单you上的方法cleaned_data,它就不起作用了。尝试了这个方法,它就起作用了,但是我有更多的表单字段。因此,我认为这种方法不起作用,因为我的所有表单字段都使用相同的键0、1、2等。它如何适应更多表单字段?ThanksIt也适用于其他选择领域。您需要添加更多的上下文变量。只需将上述代码中的“操作”替换为每个变量,或者创建一个函数来减少重复的代码。谢谢,我稍后会尝试。