Opened 17 months ago

Last modified 16 months ago

#26834 assigned Bug

MinValueValidator/MaxValueValidator not forwarded to form field for ModelForm

Reported by: Sergei Maertens Owned by: Sagar Nilesh Shah
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 (5)

comment:1 Changed 17 months 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 16 months ago by Sagar Nilesh Shah

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

comment:3 Changed 16 months ago by Sagar Nilesh Shah

Has patch: set

comment:4 Changed 16 months ago by Sagar Nilesh Shah

Version: 1.9master

comment:5 Changed 16 months ago by Tim Graham

Patch needs improvement: set

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

Note: See TracTickets for help on using tickets.
Back to Top