Consider the following model:
{{{
#!python
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:
{{{
#!python
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/26834>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* stage: Unreviewed => Accepted
* needs_tests: => 0
* needs_docs: => 0
Comment:
I'm wary of the additional complexity, but can't say that the request is
unreasonable.
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:1>
* owner: nobody => sgzsh269
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:2>
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:3>
* version: 1.9 => master
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:4>
* needs_better_patch: 0 => 1
Comment:
Comments for improvement on the PR (and some failing tests to be fixed).
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:5>
* owner: Sagar Nilesh Shah => Tobias Kunze
* needs_better_patch: 1 => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:6>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:7>
Comment (by Mariusz Felisiak):
The proposed solution has some side-effects. We should reach a wider
audience and consensus on DevelopersMailingList before moving this
forward.
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:8>
Comment (by Claude Paroz):
#25594 might be related.
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:9>
* type: Bug => New feature
--
Ticket URL: <https://code.djangoproject.com/ticket/26834#comment:10>