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、Medium 或 High,而不是 0、1 或 2 所以当我使用 is_valid() 时,它说我的表单无效,我无法创建新项目和存储它在数据库中。
有什么方法可以将 POST 数据从 HTML select 标签转换回我的 choices 中的数字并验证之后是我的 ModelForm?
谢谢
好吧,您不应该尝试手动创建 select 元素,无论是否使用 get_priority_display
。你有一个 Django 表单;它的两个职责之一[*] 是显示字段。所以:
{{ form.priority }}
将为您提供 select,其内部值和显示值已正确设置。而在视图中
form.cleaned_data['priority']
将为您提供该字段的正确值。
[*] 连同验证
在我的模型中,我有一个从 '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、Medium 或 High,而不是 0、1 或 2 所以当我使用 is_valid() 时,它说我的表单无效,我无法创建新项目和存储它在数据库中。
有什么方法可以将 POST 数据从 HTML select 标签转换回我的 choices 中的数字并验证之后是我的 ModelForm?
谢谢
好吧,您不应该尝试手动创建 select 元素,无论是否使用 get_priority_display
。你有一个 Django 表单;它的两个职责之一[*] 是显示字段。所以:
{{ form.priority }}
将为您提供 select,其内部值和显示值已正确设置。而在视图中
form.cleaned_data['priority']
将为您提供该字段的正确值。
[*] 连同验证