lightarhont
@lightarhont
python/php developer

Как перехватить тут ValidationError, что бы было как обычное исклчение в форме?

class ProductImageInstanceInline(admin.TabularInline):
    fields = ['name', 'img', 'main', 'order', 'published']
    extra = 1
    min_num = 1
    model = ProductImage

class CategoryInlineAdmin(admin.TabularInline):
    model = Product.category.through
    extra = 0
    min_num = 1


class ProductReviewInstanceInline(admin.TabularInline):
    model = ProductReview
    extra = 0
    min_num = 1

class ProductAdmin(admin.ModelAdmin):
    fields = ['name',
              'name_short',
              'name_breadcrumb',
              'slug',
              'listdesc',
              'temperature',
              'techtable',
              'content1',
              'content2',
              'content3',
              'content4',
              'content5',
              'techfile',
              'article',
              'product',
              'order',
              'published',
              ]
    
    list_display = ('name', 'sluglist_view')
    inlines = [ProductImageInstanceInline, CategoryInlineAdmin, ProductReviewInstanceInline]
    
    def sluglist_view(self, obj):
        html = '<a target="_blank" href="/catalog/%s">на сайте</a>' % (obj.slug)
        return mark_safe(html)
    sluglist_view.short_description = 'Ссылка на сайте'
    
    def save_formset(self, request, form, formset, change):
        
        if formset.model == ProductImage:
            msgimage = 'Изображения товара уже имеет главное изображение'
            msgnimage = 'Изображения товара не имеет главное изображение'
            instances = formset.save(commit=False)
            if len(instances) > 0:
                l = [ i for i in instances if i.main == True ]
                
                if len(l) > 1:
                    raise ValidationError(msgimage)
                
                c = ProductImage.objects.filter(product_id = instances[0].product_id).filter(main = True).count()
                if c != 0 and len(l) == 1:
                    raise ValidationError(msgimage)
                
                if c == 0 and len(l) == 0:
                    raise ValidationError(msgnimage)
        
        if formset.model == Product.category.through:
            msg = 'Категории товара уже есть главная'
            msgn = 'Категории товара не имеет главной'
            msgd = 'Категории повторяются'
            instances = formset.save(commit=False)
            
            if len(instances) > 0:
                l = [ i for i in instances if i.main == True ]
                if len(l) > 1:
                    raise ValidationError(msg)
                c = Product.category.through.objects.filter(product_id = instances[0].product_id).filter(main = True).count()
                if c != 0 and len(l) == 1:
                    raise ValidationError(msg)
                
                if c == 0 and len(l) == 0:
                    raise ValidationError(msgn)
                
                idsobjs = Product.category.through.objects.filter(product_id = instances[0].product_id).all()
                ids = [ i.category_id for i in instances ]
                idsobjsl = [ i.category_id for i in idsobjs ]
                ids.extend(idsobjsl)
                if len(ids) != len(set(ids)):
                    raise ValidationError(msgd)
                
        formset.save()


Требуется не ошибка 500, а перехват её с выводом сообщения об ошибке валидации
  • Вопрос задан
  • 33 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы