我有点困惑,因为我认为这将是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和其他验证,但我无法找到它被推送的位置。一旦我发现它,我可以尝试编写自己的课程,但我无法弄清楚要覆盖什么。
答案 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,但我仍然无法在源代码中找到可能为验证提供错误行为的位置。如果有人可以指出我正确的方向,我会很高兴,因为我仍然宁愿修复我正在使用的版本,所以我可以有一些更清晰的代码来处理。如果有人可以提供帮助,那么可以将其保留一周,然后将其标记为答案。