Opened 3 years ago

Last modified 2 weeks ago

#26834 assigned Bug

MinValueValidator/MaxValueValidator not forwarded to form field for ModelForm

Reported by: Sergei Maertens Owned by: Tobias Kunze
Component: Forms Version: master
Severity: Normal Keywords: MaxValueValidator, MinValueValidator, ModelForm, IntegerField
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

I just ran into a possible enhancement.

Consider the following model:

DEFAULT_RATING = 50
MAX_RATING = 100
MIN_RATING = 0


class KitReviewPropertyRating(models.Model):
    """
    Represents properties for a kit review rated on a scale from MIN_RATING to MAX_RATING
    """
    kit_review = models.ForeignKey('KitReview', related_name='ratings')
    prop = models.ForeignKey('KitReviewProperty')
    rating = models.PositiveSmallIntegerField(
        _('rating'), default=DEFAULT_RATING,
        validators=[MinValueValidator(MIN_RATING), MaxValueValidator(MAX_RATING)]
    )

and the matching ModelForm:

from django.forms.widgets import NumberInput


class RangeInput(NumberInput):
    input_type = 'range'


class KitReviePropertyRatingForm(forms.ModelForm):

    class Meta:
        model = KitReviewPropertyRating
        fields = ('id', 'prop', 'rating')
        widgets = {
            'rating': RangeInput(attrs={'max': MAX_RATING})
        }

As you can see, I have to specify the max widget attribute manually, otherwise the html input looks like this: <input type="range" name="rating" value="50" min="0">, instead of the expected <input type="range" name="rating" value="50" min="0" max="100">. I had expected the Min/MaxValueValidator to be 'forwarded' to the form field (via IntegerField.formfield method), but no such thing happens. #26786 does add the validators on the model level, based on the db connection used and the limits there, and only if no such validators were present yet.

I'd like to make it so that Min/MaxValueValidators are translated into min_value/max_value defaults for the IntegerField.formfield method, this would be more in line with the expected output and reduce the need to repeat yourself.

Change History (7)

comment:1 Changed 3 years ago by Tim Graham

Triage Stage: UnreviewedAccepted

I'm wary of the additional complexity, but can't say that the request is unreasonable.

comment:2 Changed 3 years ago by Sagar Nilesh Shah

Owner: changed from nobody to Sagar Nilesh Shah
Status: newassigned

comment:3 Changed 3 years ago by Sagar Nilesh Shah

Has patch: set

comment:4 Changed 3 years ago by Sagar Nilesh Shah

Version: 1.9master

comment:5 Changed 3 years ago by Tim Graham

Patch needs improvement: set

Comments for improvement on the PR (and some failing tests to be fixed).

comment:6 Changed 3 weeks ago by Tobias Kunze

Owner: changed from Sagar Nilesh Shah to Tobias Kunze
Patch needs improvement: unset

comment:7 Changed 2 weeks ago by felixxm

Patch needs improvement: set
Note: See TracTickets for help on using tickets.
Back to Top