У меня есть настраиваемое поле с именем CustomField
, чтобы обернуть класс с именем Example
примерно так:
from django import forms
from django.db import models
from . import Example
class CustomField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
try:
return Example(value)
except Example.InvalidValueException:
raise forms.ValidationError('bad value!')
def get_prep_value(self, value):
return unicode(value)
def formfield(self, **kwargs):
defaults = {'form_class': forms.CharField}
defaults.update(kwargs)
return super(CustomField, self).formfield(**defaults)
Проблема в формах администратора: когда ValidationError
вызывается в clean()
или validate()
методов для поля, сообщение об ошибке отображается аккуратно рядом с соответствующим полем ввода в форме.Тем не менее, когда он вызывается в методе to_python()
, как в моем настраиваемом поле, недопустимое значение некорректно разрывает форму и отображает страницу ошибки с обратной трассировкой около ValidationError
.Как заставить мое поле корректно работать с формами администратора Django?
РЕДАКТИРОВАТЬ: Основываясь на предложении ниже, я попытался:
class CustomFieldForm(forms.CharField):
def validate(self, value):
raise forms.ValidationError('test')
И изменил метод formfield()
, чтобы использоватьКласс выглядит так:
def formfield(self, **kwargs):
defaults = {'form_class': CustomFieldForm}
defaults.update(kwargs)
return super(CustomField, self).formfield(**defaults)
Тем не менее, метод to_python()
по-прежнему вызывается до того, как метод CustomFieldForm.validate()
и Example.InvalidValueException
, вызванные в предыдущем методе в случае недопустимого значения, нарушают форму администратора.