Помощь с проверкой в ​​моделях и формах - PullRequest
0 голосов
/ 01 июля 2011

У меня есть несколько вопросов о проверке в моделях и формах. Не могли бы вы помочь мне с этим:


Где должна проводиться проверка? Должно ли это быть в модели или форме? Правильный ли путь для этого - иметь валидаторы в форме и ограничения в режиме?


В чем разница между написанием метода 'clean_' в форме и написанием валидатора? Я видел, что люди часто помещают проверки в метод 'clean_'.


В запросе, который я обрабатываю, у меня в строке URL есть параметр с именем 'alive'. Обычно это 1 или 0. Как правильно определить это в моей форме? Мне нужно подтвердить, что это число и может быть только 1 или 0. Это правильный путь?

alive = models.IntegerField(null=False, max_value=1, min_value=0)

Как определить значение по умолчанию для этого поля, т. Е. Если этот параметр не передан, по умолчанию используется значение 0 (False).

У меня нет формы на стороне клиента. Я использую форму Django для проверки моего запроса JS POST.


В одном из полей модели мне нужно сохранить разрешение экрана в формате 1234x4321. Должен ли я объявить это как CharField добавить некоторую проверку правильности регулярного выражения в и Модель и Форму? Были бы полезны любые примеры проверок регулярных выражений.


Спасибо.

1 Ответ

1 голос
/ 01 июля 2011

Проверка должна быть сделана на форме, а не на модели.Однако, если вы используете ModelForms, что обычно имеет большой смысл, он унаследует некоторые правила проверки от самих моделей (те, которые относятся к базе данных, например, максимальная длина поля, тип поля базы данных, но также, если они могут бытьне заполнено).

Значение поля по умолчанию должно быть передано его конструктором:

form = SomeForm(initial={'alive' : 0})

Хотя в вашем случае получается, что если значения, которые могут быть получены, равны только нулю и единице, онобыло бы разумно использовать вместо него BooleanField (т. е. в этом случае по умолчанию оно будет равно false).

В случае разрешений я бы создал отображение между возможным разрешением и некоторым произвольным значением.

RESOLUTIONS = (                                                
        ("1","800x600"),
        ("2","1024x768"),                            
         .....                        
)   

и затем передайте его модели:

resolutions = models.CharField(RESOLUTIONS, max_length=1)

, чтобы пользователь получил поле выбора с соответствующими параметрами и значениями.С другой стороны, если вам нужно, чтобы пользователь вставил его сам, использовать два поля (одно для ширины, другое для высоты) было бы намного проще, чем проверка ввода пользователя.

Таким образом, вы можете определитьМетод для модели:

def get_resolution(self):
    return "%sx%s" % (self.width, self.height)
...