我准备了WeekdayField
,似乎和预期的一样。你知道吗
from django.db.models import PositiveSmallIntegerField
from django.core import validators
_ = lambda x: x
class WeekdayField(PositiveSmallIntegerField):
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 5
SATURDAY = 6
SUNDAY = 7
DAY_OF_THE_WEEK = (
(MONDAY, _('Monday')),
(TUESDAY, _('Tuesday')),
(WEDNESDAY, _('Wednesday')),
(THURSDAY, _('Thursday')),
(FRIDAY, _('Friday')),
(SATURDAY, _('Saturday')),
(SUNDAY, _('Sunday')),
)
default_validators = [
validators.MinValueValidator(MONDAY),
validators.MaxValueValidator(SUNDAY)
]
def __init__(self, *args, **kwargs):
kwargs['choices'] = WeekdayField.DAY_OF_THE_WEEK
super(WeekdayField, self).__init__(*args, **kwargs)
当我开始为这个自定义字段编写unittests时,我发现了一些问题。你知道吗
我很惊讶,验证器只能由django表单调用。你知道吗
from django.contrib.humanize.templatetags.humanize import ordinal
from django.db import models
from django.forms.models import ModelForm
from django.test import TestCase
from services.fields import WeekdayField
class DayOfTheWeek(models.Model):
day = WeekdayField()
class DayOfTheWeekForm(ModelForm):
class Meta:
model = DayOfTheWeek
fields = ['day']
class WeekdayFieldTests(TestCase):
def _check_day(self, day, expected):
form = DayOfTheWeekForm({'day': day})
self.assertEqual(
form.is_valid(),
expected,
'There is no %s day of the week' % ordinal(day)
)
def test_7_days(self):
days = range(WeekdayField.MONDAY, len(WeekdayField.DAY_OF_THE_WEEK)+1)
for day in days:
self._check_day(day, True)
def test_no_0th_day_in_the_week(self):
self._check_day(0, False)
def test_no_13th_day_in_the_week(self):
self._check_day(13, False)
有没有更好的方法写这个?你知道吗
重构之后,我有了这样的东西:
我决定不使用
validators.MinValueValidator
和validators.MaxValueValidator
,因为它们不会返回最佳错误消息。你知道吗好消息是,测试文件中的新表单不需要测试该字段:)
以及测试:
相关问题 更多 >
编程相关推荐