Django:在“ form.is_valid”之前切片表单数据

时间:2019-02-02 13:46:40

标签: python django slice

我有一个ModelForm,它为我的类Person保存并创建一个新对象。 此类Person具有一个称为is_adult的属性。 它的值是带有model.CharField的{​​{1}},我只保存值max_length=1Y(是/否)。

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

models.py:

if form.is_valid()

choices.py:

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

forms.py:

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

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

1 个答案:

答案 0 :(得分:0)

标记为重复,但是您应该使用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?