Catch decimal.ConversionSyntax django import export

Мне нужно иметь возможность отображать ошибку относительно недопустимых десятичных дробей и недопустимых внешних ключей более удобным для пользователя способом.

Я думал, что clean_model_instances = True поймает его, но он не поймал.

Ошибка недопустимой десятичной дроби:

Ошибка недопустимого внешнего ключа:

enter image description here

Я хотел отобразить эту ошибку вместе со всеми другими ошибками здесь:

enter image description here

Заранее спасибо!

Есть несколько способов решить эту проблему.

  1. Для DecimalWidget объявите его как CharWidget - это будет обрабатывать любую строку ввода, и если у вас включено clean_model_instances, то при проверке объекта модели будет выдана ошибка.

  2. Для 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

enter image description here

Вернуться на верх