Django POST验证将数字视为字符串

时间:2017-08-19 19:19:52

标签: django django-models django-forms

我有点困惑,因为我认为这将是Django验证的一部分...我在1.8上因为我使用的是一个较旧的数据库连接库,最后使用1.8进行了测试(重写旧数据的前端。)

models.py:

class Order(models.Model):
    #rest of class#
    RequestorNumber = models.SmallIntegerField(db_column='requestor_no')

class Requestor(models.Model):
    RequestorNumber = models.SmallIntegerField(primary_key=True, db_column="requester_no")
    Requestor = models.CharField(max_length=20, db_column = "requester")

    def __str__(self):
         return self.Requestor

forms.py

class OrderForm(forms.ModelForm):
RequestorNumber = forms.ModelChoiceField(queryset=Requestor.objects.all().order_by('RequestorNumber'), label="Requestor")

因此,这会在模板中创建一个正确的下拉列表,其值为整数,文本为ex:

<option value="1" selected="selected">JOHN DOE</option>

提交表单时,POST QueryDict在打印整个请求时有一个正确的条目:

...
'OrderForm-RequestorNumber': ['1']
...

但是这是以字符串形式出现的(正如我所料),但是在执行is_valid()时验证器会回来并且网页获得:

'JOHN DOE'值必须是整数。

这是设计的吗?我觉得它正在尝试忽略所选表单的值,并将对象的__str__定义作为需要保存的内容返回。如果这是愚蠢的,我也很想知道什么是更正确的方法,唯一的问题是我无法更改数据库模式,并且所有表在meta中都是托管= False。

编辑:我覆盖了表单中的clean_RequestorNumber,以便输出它认为应该保存的值,并且它给出了方法的__str__而不是主键的值。

我需要更改此行为,但我无法确定正在进行验证的源代码中的位置。在models.py,fields.py和widgets.py之间,我可以看到必需的,valid_choice和其他验证,但我无法找到它被推送的位置。一旦我发现它,我可以尝试编写自己的课程,但我无法弄清楚要覆盖什么。

1 个答案:

答案 0 :(得分:0)

class OrderForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
    super(OrderForm, self).__init__(*args, **kwargs)
    self.fields['RequestorNumber'].choices = [(x.pk, x.Requestor) for x in Requestor.objects.all()]

RequestorNumber = forms.ChoiceField()

在ModelChoiceField正确验证之前,以旧的方式进行验证。不知道这是否已经修复了1.8,但我仍然无法在源代码中找到可能为验证提供错误行为的位置。如果有人可以指出我正确的方向,我会很高兴,因为我仍然宁愿修复我正在使用的版本,所以我可以有一些更清晰的代码来处理。如果有人可以提供帮助,那么可以将其保留一周,然后将其标记为答案。