from satchless.forms.widgets import DecimalInput from satchless.product.forms import BaseVariantForm from . import models class ProductPriceForm(forms.ModelForm): class Meta: widgets = { 'price': DecimalInput(min_decimal_places=2), } class ShoeVariantForm(BaseVariantForm): def __init__(self, *args, **kwargs): super(ShoeVariantForm, self).__init__(*args, **kwargs): self.fields['color'].choices = [ (k,v) for k,v in models.ShoeVariant.COLOR_CHOICES if k in self.product.variants.values_list('color', flat=True).distinct() ] color = forms.CharField( max_length=10, widget=forms.Select(choices=models.ShoeVariant.COLOR_CHOICES)) size = forms.CharField( max_length=6, widget=forms.Select(choices=models.ShoeVariant.SIZE_CHOICES)) def _get_variant_queryset(self): return models.ShoeVariant.objects.filter( product=self.product, color=self.cleaned_data['color'], size=self.cleaned_data['size'], ) def clean(self): if not self._get_variant_queryset().exists(): raise forms.ValidationError("Variant does not exist") return self.cleaned_data def get_variant(self): return self._get_variant_queryset().get()