Catch decimal.ConversionSyntax django import export
Мне нужно иметь возможность отображать ошибку относительно недопустимых десятичных дробей и недопустимых внешних ключей более удобным для пользователя способом.
Я думал, что clean_model_instances = True
поймает его, но он не поймал.
Ошибка недопустимой десятичной дроби:
Ошибка недопустимого внешнего ключа:
Я хотел отобразить эту ошибку вместе со всеми другими ошибками здесь:
Заранее спасибо!
Есть несколько способов решить эту проблему.
Для
DecimalWidget
объявите его какCharWidget
- это будет обрабатывать любую строку ввода, и если у вас включеноclean_model_instances
, то при проверке объекта модели будет выдана ошибка.Для
ForeignKeyWidget
вам придется переопределить методclean()
, чтобы он выдавал ошибкуValueError
для несуществующей ссылки. IMO это не идеально, поскольку нарушает контракт для функцииclean()
. Сообщение об ошибке не идеально, но оно достигает того, что вы хотите.
class ValidatingForeignKeyWidget(widgets.ForeignKeyWidget):
def clean(self, value, row=None, *args, **kwargs):
try:
val = super().clean(value)
except self.model.DoesNotExist:
raise ValueError(f"{self.model.__name__} with value={value} does not exist")
return val
class BookResource(ModelResource):
price = fields.Field(attribute='price', widget=widgets.CharWidget())
author = fields.Field(attribute="author", widget=ValidatingForeignKeyWidget(Author))
class Meta:
model = Book
clean_model_instances = True