Проверка пользовательских полей Django - PullRequest
2 голосов
/ 04 февраля 2011

Существует тип поля Django для хранения значений MyType.

from django.core.exceptions import ValidationError
from django.db import models

class MyTypeField(models.Field):
    __metaclass__ = models.SubfieldBase

    def db_type(self, connection):
        return "text"

    def to_python(self, value):
        if isinstance(value, basestring):
            try:
                value = MyType.deserialize(value)
            except ParseError, e:
                raise ValidationError("Invalid format: "+str(e))
        assert isinstance(value, MyType)
        return value

    def get_prep_value(self, value):
        if not isinstance(value, MyType):
            raise ValidationError("Not MyType")
        return value.serialize()

Я пытаюсь использовать поля этого типа на странице администратора модели.Все работает хорошо, если пользователь вводит допустимое значение в поле.Но если введенное значение неверно, ValidationError не перехватывается (вы получаете ошибку 500 или трассировку стека, если включена отладка)

Вместо этого я хочу увидеть форму с сообщением «Неверный формат»рядом с полем (так же, как если вы введете неправильную дату или номер).Как изменить класс поля для получения ошибок проверки в правильном месте.

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011

Цитирование из http://docs.djangoproject.com/en/1.2/howto/custom-model-fields/#modelforms-and-custom-fields

Если вы используете SubfieldBase, to_python () будет вызываться каждый раз, когда экземпляр поля присваивается значение. это означает, что всякий раз, когда значение может быть присвоено поле, нужно убедитесь, что он будет правильным тип данных, или что вы обрабатываете любой исключения.

Таким образом, ошибка ValidationError никогда не будет обнаружена на этом этапе. to_python также вызывается при заполнении нового экземпляра вашей модели из базы данных, которая находится вне контекста проверки формы.

Следовательно, вы должны убедиться, что поле формы используется для представления вашего настраиваемое поле выполняет любой ввод проверка и очистка данных необходимо конвертировать предоставленные пользователем Форма ввода в to_python () - поле совместимой модели значение. Это может потребовать написания настраиваемое поле формы и / или реализация метод formfield () на вашем поле вернуть класс поля формы, чей to_python () возвращает правильный Тип данных.

Итак, вам нужно перенести валидацию в поле формы.

1 голос
/ 04 февраля 2011

Вам необходимо создать clean(self, value, model_instance) метод в вашем классе поля и выполнить проверку / вызвать ошибку там.

...