Bạn cũng có thể tạo loại trường mô hình tùy chỉnh - xem http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
Trong trường hợp này, bạn có thể 'kế thừa' từ IntegerField tích hợp và ghi đè logic xác thực của nó.
Càng nghĩ nhiều về điều này, tôi càng nhận ra điều này hữu ích như thế nào đối với nhiều ứng dụng Django. Có lẽ loại IntegerRangeField có thể được gửi dưới dạng bản vá cho các nhà phát triển Django để xem xét thêm vào thân cây.
Điều này làm việc cho tôi:
from django.db import models
class IntegerRangeField(models.IntegerField):
def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
self.min_value, self.max_value = min_value, max_value
models.IntegerField.__init__(self, verbose_name, name, **kwargs)
def formfield(self, **kwargs):
defaults = {'min_value': self.min_value, 'max_value':self.max_value}
defaults.update(kwargs)
return super(IntegerRangeField, self).formfield(**defaults)
Sau đó, trong lớp mô hình của bạn, bạn sẽ sử dụng nó như thế này (trường là mô-đun nơi bạn đặt mã ở trên):
size = fields.IntegerRangeField(min_value=1, max_value=50)
HOẶC cho một phạm vi âm và dương (như phạm vi dao động):
size = fields.IntegerRangeField(min_value=-100, max_value=100)
Điều tuyệt vời là nếu nó có thể được gọi với toán tử phạm vi như thế này:
size = fields.IntegerRangeField(range(1, 50))
Nhưng, điều đó sẽ đòi hỏi nhiều mã hơn vì bạn có thể chỉ định tham số 'bỏ qua' - phạm vi (1, 50, 2) - Ý tưởng thú vị mặc dù ...