Django - 在验证 ModelForm 之前,将从 POST 请求中的 HTML select 获取的值转换回数字

Django - Convert value get from HTML select in POST request back to number before validate ModelForm

在我的模型中,我有一个从 'choices' 填充的字段,如下所示:

PRIORITY = (
    (0, 'Low'),
    (1, 'Medium'),
    (2, 'High'),
)

priority = models.IntegerField(choices=PRIORITY, default=0)

因此在我的数据库中,它将存储为 0、1 或 2。

优先级字段将由HTML select标签显示。我正在使用 instance.get__priority__display 来显示 priority 字段。

现在我有一个模型表单,它将采用此优先级

class NewItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ['priority']

在我看来,当用户单击一个按钮时,我在 views.py 中的函数将获取用户输入的值 select 并将其存储在数据库中的新项目。但我现在的问题是,因为我从 POST 请求中得到的值是 Low、MediumHigh,而不是 0、1 或 2 所以当我使用 is_valid() 时,它说我的表单无效,我无法创建新项目和存储它在数据库中。

有什么方法可以将 POST 数据从 HTML select 标签转换回我的 choices 中的数字并验证之后是我的 ModelForm?

谢谢

好吧,您不应该尝试手动创建 select 元素,无论是否使用 get_priority_display。你有一个 Django 表单;它的两个职责之一[*] 是显示字段。所以:

{{ form.priority }}

将为您提供 select,其内部值和显示值已正确设置。而在视图中

form.cleaned_data['priority']

将为您提供该字段的正确值。

[*] 连同验证