Opened 7 years ago
Last modified 3 months ago
#26834 assigned New feature
MinValueValidator/MaxValueValidator not forwarded to form field for ModelForm
Reported by: | Sergei Maertens | Owned by: | Tobias Kunze |
---|---|---|---|
Component: | Forms | Version: | dev |
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 (10)
comment:1 Changed 7 years ago by
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 Changed 7 years ago by
Owner: | changed from nobody to Sagar Nilesh Shah |
---|---|
Status: | new → assigned |
comment:3 Changed 7 years ago by
Has patch: | set |
---|
comment:4 Changed 7 years ago by
Version: | 1.9 → master |
---|
comment:5 Changed 7 years ago by
Patch needs improvement: | set |
---|
Comments for improvement on the PR (and some failing tests to be fixed).
comment:6 Changed 4 years ago by
Owner: | changed from Sagar Nilesh Shah to Tobias Kunze |
---|---|
Patch needs improvement: | unset |
comment:7 Changed 4 years ago by
Patch needs improvement: | set |
---|
comment:8 Changed 2 years ago by
The proposed solution has some side-effects. We should reach a wider audience and consensus on DevelopersMailingList before moving this forward.
comment:10 Changed 3 months ago by
Type: | Bug → New feature |
---|
I'm wary of the additional complexity, but can't say that the request is unreasonable.