On Sun, Oct 26, 2014 at 12:37 AM, Kafex <
kaf...@gmail.com> wrote:
> If I have the following model...
> class FruitType(models.Model):
> name = models.CharField(max_length=255)
>
> And I insert some records...
> FruitType.objects.create(name="Apple")
> FruitType.objects.create(name="Orange")
>
> Why is this valid?
> FruitType.objects.get(id=1.2) # Gets me the apple
> FruitType.objects.get(id=2.9) # Gets me the apple
>
>
> Django seems to truncate the id to just the integer part.
Yes. The value is coerced to int, that is int(value) will be run on
it. If you pass a type that can be coerced to an int, no error will be
raised, so be aware of that.
> This also applies to form validation:
> class FruitForm(forms.Form):
> type = forms.ModelChoiceField(queryset=FruitType.objects.all())
>
> form = FruitForm(data={'type': 1.5})
> form.is_valid() # returns True
>
> Is there any way to prevent this? I.e., I want my form to treat 1.5 as
> invalid input and raise a ValidationError.
This one is less obviously a problem, a typical form would actually be
passed the string '1.5' (not the float 1.5), which would in fact raise
a ValidationError.
Cheers
Tom