Anda juga dapat membuat jenis bidang model khusus - lihat http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
Dalam hal ini, Anda bisa 'mewarisi' dari IntegerField bawaan dan mengganti logika validasinya.
Semakin saya memikirkan hal ini, saya menyadari betapa berharganya hal ini bagi banyak aplikasi Django. Mungkin tipe IntegerRangeField dapat dikirimkan sebagai tambalan untuk pengembang Django untuk dipertimbangkan menambah trunk.
Ini bekerja untuk saya:
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)
Kemudian di kelas model Anda, Anda akan menggunakannya seperti ini (bidang menjadi modul tempat Anda meletakkan kode di atas):
size = fields.IntegerRangeField(min_value=1, max_value=50)
ATAU untuk rentang negatif dan positif (seperti rentang osilator):
size = fields.IntegerRangeField(min_value=-100, max_value=100)
Apa yang akan sangat keren adalah jika bisa dipanggil dengan operator jarak seperti ini:
size = fields.IntegerRangeField(range(1, 50))
Tapi, itu akan membutuhkan lebih banyak kode karena sejak Anda dapat menentukan parameter 'lewati' - rentang (1, 50, 2) - Namun, ide yang menarik ...