from django import forms from django.core.exceptions import ValidationError from shop.models import ProductVariant class ProductVariantForm(forms.ModelForm): class Meta: model = ProductVariant fields = ('sku', 'stock', 'attribute_values') widgets = {'attribute_values': forms.CheckboxSelectMultiple} def __init__(self, *args, product=None, **kwargs): super().__init__(*args, **kwargs) self.product = product or self.instance.product def clean(self): cleaned_data = super().clean() attribute_values = cleaned_data.get('attribute_values') if attribute_values is not None: combination = set(attribute_values.values_list('pk', flat=True)) siblings = ProductVariant.objects.filter(product=self.product).exclude(pk=self.instance.pk) for sibling in siblings: if set(sibling.attribute_values.values_list('pk', flat=True)) == combination: raise ValidationError( 'Ya existe una variante de este producto con la misma combinación de atributos.' ) return cleaned_data def save(self, commit=True): self.instance.product = self.product return super().save(commit=commit)