2011-02-04 7 views
2

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

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 или трассировку стека, если debug включен)

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

ответ

4

Цитируя http://docs.djangoproject.com/en/1.2/howto/custom-model-fields/#modelforms-and-custom-fields

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

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

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

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

+0

Ну, это может быть вариант. – grep

1

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

+1

Для полей 'SubfieldBase'' clean' не вызывается. Вероятно, мне нужно избавиться от SubfieldBase (любые примеры?) – grep

Смежные вопросы