Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from typing import Dict, Optional, Any
- from django.db import models
- from django.core.validators import MinValueValidator, MaxValueValidator
- from django import forms
- class BaseBoundedField(models.Field):
- def __init__(
- self,
- min_value: float = float('-infinity'),
- max_value: float = float('infinity'),
- step: Optional[float] = None,
- *args: Any, **kwargs: Any):
- self.max_value = max_value
- self.min_value = min_value
- self.step = step
- kwargs['validators'] = list(kwargs.get('validators', [])) + [
- MinValueValidator(self.min_value),
- MaxValueValidator(self.max_value)]
- super().__init__(*args, **kwargs)
- def _get_widget_attrs(self) -> Dict[str, str]:
- attrs = {}
- if self.max_value < float('infinity'):
- attrs['max'] = str(self.max_value)
- if self.min_value > float('-infinity'):
- attrs['min'] = str(self.min_value)
- if self.step is not None:
- attrs['step'] = str(self.step)
- return attrs
- class BoundedFloatField(BaseBoundedField, models.FloatField):
- def formfield(self, **kwargs: Any) -> forms.Field:
- defaults = {
- 'widget': forms.NumberInput(attrs=self._get_widget_attrs()),
- }
- defaults.update(kwargs)
- return super().formfield(**defaults)
- class BoundedIntegerField(BaseBoundedField, models.IntegerField):
- def formfield(self, **kwargs: Any) -> forms.Field:
- defaults = {
- 'widget': forms.NumberInput(attrs=self._get_widget_attrs()),
- }
- defaults.update(kwargs)
- return super().formfield(**defaults)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement