python - Django:在 "form.is_valid"之前切片表单数据

标签 python django slice

我有一个 ModelForm,它为我的类 Person 保存并创建一个新对象。 此类 Person 有一个名为 is_adult 的属性。 它的值是带有 max_length=1model.CharField,我在其中仅保存值 YN (是/否)。

问题在于此 attr 呈现为 Select HTML 字段。在这个 Select 字段中,可用的选择是“Yes”和“No”,因此当表单作为 POST 方法发送时,它带有一个 2-3 长度 CharField 的值,但它的 Model attr 的 max_length 为 1,所以我需要在检查 if form.is_valid() 之前对这两个选项进行切片。否则,该表单将不被接受,因为它发布的值为 2-3 个字符,而预期为 1 个字符。

模型.py:

class Person(models.Model):
    is_adult = models.CharField(max_length=1, null=False, choices=ADULT_CHOICES, default='N')

选择.py:

ADULT_CHOICES= (
        (0, 'No'),
        (1, 'Yes'),
)

表单.py:

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ["is_adult"]
        widgets = {
            'is_adult': forms.Select(attrs={'class': 'form-control'}),
        }
        labels= {
            'is_adult': 'Is an adult?',
        }

当然,views.py 期望的是“Y”或“N”,而不是"is"或“否”。 我尝试使用 Python 语法对其字符串进行切片,但在“form.is_valid”中被拒绝之前我无法获取表单字段值。 有什么解决办法吗?谢谢!

最佳答案

标记为重复,但您应该使用choice form field .

将 forms.py 更改为以下内容:

class PersonForm(forms.ModelForm): 
    class Meta:
        model = Person
        fields = ["is_adult"]
        labels= {
            'is_adult': 'Is an adult?',
        }

模型表单的默认行为应使用 form.ChoiceField ,它应自动将您的选择选项(在 HTML 中)设置为正确的“Y”和“N”值。

你不需要切片任何东西,因为 Django 应该为你处理这个。

当使用 ChoiceField 时,您的 HTML 应该像这样呈现(注意选项 values):

<select>
  <option value="Y">Yes</option>
  <option value="N">No</option>
</select>

查看重复问题:How do I use Django's form framework for select options?

关于python - Django:在 "form.is_valid"之前切片表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493655/

相关文章:

python - 如何在 matplotlib.pyplot 中关闭自动缩放

Python 正则表达式速度 - 贪婪与非贪婪

django - App Engine/Django - 交错多个请求干扰 GAE session

go - 有没有办法将 map 附加到 slice ?

python - 根据 python 列表中的索引删除列时避免差一错误

dictionary - 遍历包含不同级别 map 的界面 map

python - 需要 PEP 302 实现细节

python - 主程序结束时如何终止线程?

python - 显示 ico 文件但不显示 jpg/png,{% load staticfiles %} 破坏了代码

python - 在 Django 模板中声明变量和 if 语句