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