error formset Django

0

I am editing a product form in which I want to replace several sizes in a product. If you have created 5 and when updating the pass 1 single form returns this error:

  

MultiValueDictKeyError at / edit-article-boutique / test /

     

"'sizes-1-id'"

Is there any way to "clean" this?

I pass the code:

View

@method_decorator(login_required, name='dispatch')
@method_decorator(permisoPropiedadProducto, name='dispatch')
class EditarArticuloBoutiqueView(UpdateView):
    model = Producto
    form_class = ProductoForm
    template_name = 'intranet/boutique/editar_producto.html'
    fotoFormSet = inlineformset_factory(Producto, Foto, form=FotoForm, extra=4, max_num=4, can_delete=False, can_order=False, widgets={'class': 'imgInp'})
    stockFormSet = inlineformset_factory(Producto, Stock, form=StockForm, extra=0, max_num=20, can_delete=True, can_order=True)

    def get_context_data(self,**kwargs):
        context = super(EditarArticuloBoutiqueView, self).get_context_data(**kwargs)
        perfil = Perfil.objects.get(usuario=self.request.user)
        if self.request.POST:
            context['formset'] = self.fotoFormSet(self.request.POST, instance=self.object)
            context['perfil'] = Perfil.objects.get(usuario=self.request.user)
            context['stockformset'] = self.stockFormSet(self.request.POST, instance=self.object)
        else:
            context['formset'] = self.fotoFormSet(instance=self.object)
            context['perfil'] = Perfil.objects.get(usuario=self.request.user)
            tallas = []
            for t in Stock.objects.filter(producto = self.object):
                tallas.append(t.id)
            context['tallas'] = tallas
            context['stockformset'] = self.stockFormSet(instance=self.object)
            context['imagenes'] = Foto.objects.filter(producto=self.object.id)
        try:
            vacaciones = Vacaciones.objects.get(perfil=perfil)
        except:
            vacaciones = None
        context['vacaciones'] = vacaciones
        context['count_productos'] = contador_productos(perfil)
        context['cat_padre'] = Categoria.objects.filter(level=0).order_by('posicion')
        promocion = Promocion.objects.get(id=1)
        if promocion.activo == True:
            context['promocion'] = promocion
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        formset = self.fotoFormSet(request.POST, request.FILES, instance=self.object)
        stockformset = self.stockFormSet(request.POST, instance = self.object)
        print(request.POST)
        if form.is_valid() and formset.is_valid():
            producto = form.save(commit=False)
            producto_guardado = Producto.objects.get(id=producto.id)
            fotos = formset.save(commit=False)
            if stockformset.is_valid():
                if producto.estado_prod != 1:
                    valor = Valor.objects.get(id=request.POST.get('talla'))
                    Stock.objects.create(producto=producto,talla=valor,cantidad=1)
                else:
                    print(stockformset.cleaned_data)
                    stockformset.save()
            else:
                for s in stockformset:
                    s.save()
            if (producto_guardado.nombre == producto.nombre and producto_guardado.descrip == producto.descrip
                and producto_guardado.categoria == producto.categoria and producto_guardado.estado_prod == producto.estado_prod
                and producto_guardado.medidas == producto.medidas and len(fotos) == 0):
                producto.save()
                likes = Like.objects.filter(producto=producto)
                for l in likes:
                    notificacion = Notificacion.objects.get(perfil=l.perfil)
                    if notificacion.baja_precio == True:
                        try:
                            ColaNotificaciones.objects.create(remitente=producto.perfil.id,destinatario=p.id,asunto=4)
                        except:
                            None
                return redirect('/producto/' + producto.slug)
            else:    
                producto.estado_rev = 2
            formset.save()
            if Foto.objects.filter(producto=producto).count() > 0:
                producto.save()
                return redirect('/producto/' + producto.slug)
            else:
                producto.estado_rev = 1
                producto.save()
                formset.save()
                return redirect('/prendas-borrador/' + producto.perfil.slug)

Forms

class StockForm (forms.ModelForm):

class Meta:
    model = Stock
    fields = ['producto','cantidad','talla']
    widgets = {
        'talla': forms.HiddenInput(attrs = {'class': 'sel-talla',}),
        'cantidad': forms.NumberInput(attrs = {'class': 'cant-talla',}),
    }

class ProductoEditarForm(forms.ModelForm):
    class Meta:
        model = Producto
        fields = ['nombre', 'color', 'estado_prod', 'descrip', 'medidas', 'p_compra',
                    'categoria', 'p_venta', 'marca','estado_rev']

    '''marca = forms.ModelChoiceField(
        queryset=Marca.objects.all(),
        widget=autocomplete.ModelSelect2(url='marca-autocomplete')
    )

    categoria = TreeNodeChoiceField(
        queryset = Categoria.objects.all()
    )'''


    def clean_descrip(self):
        descrip = self.cleaned_data.get('descrip')
        caracteres = len(descrip)
        if caracteres < 80:
            raise forms.ValidationError('Este campo debe tener al menos 80 caracteres')
        return descrip
    
asked by F Delgado 16.07.2018 в 10:45
source

0 answers