Помощь с проверкой в ​​моделях и формах

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


Где должна проходить валидация? Должна ли она быть в Модели или Форме? Правильный ли способ сделать это — иметь валидаторы в форме и ограничения в режиме?


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


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

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

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

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


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


Спасибо.


person Mridang Agarwalla    schedule 01.07.2011    source источник


Ответы (1)


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

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

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)
person Uku Loskit    schedule 01.07.2011
comment
Привет, Уку, я бы хотел сохранить разрешение в формате XXXXxXXXX, потому что в нашем случае у нас много комбинаций. Не могли бы вы показать мне, какие проверки и ограничения мне понадобятся для реализации этого? Спасибо. - person Mridang Agarwalla; 01.07.2011
comment
Что ж, не нужно слишком усложнять, просто сохраните их в разных полях, одно для высоты и одно для ширины. - person Uku Loskit; 01.07.2011
comment
Эй, Уку, ты прав. Еще одно: у меня есть приложение Django, которое принимает JS-запрос и сохраняет данные в виде набора моделей. Нет клиентской формы, которая публикует это. это JS, который вычисляет вещи и делает запрос за кулисами. Что было бы целесообразно — создать одну Форму на весь запрос, переопределить метод сохранения формы и добавить логику сохранения данных в соответствующие директории моделей --ИЛИ-- создать отдельные ModelForms для каждой модели, в которую необходимо данные спастись? - person Mridang Agarwalla; 01.07.2011