widgets update tipos personalizados formularios form fields ejemplos avanzados python django django-forms django-crispy-forms

python - update - tipos de formularios en django



Registro de inserciĆ³n de formulario Django en lugar de registro de actualizaciĆ³n (2)

Intenta obtener el objeto por pk, por ejemplo

DetalleRecepcion.objects.get(pk=kwargs[''pk''])

Tengo problemas tratando de actualizar algunos registros en Django: cuando trato de actualizar algún registro, la aplicación inserta uno nuevo, no sé por qué tengo este comportamiento.

Modelo

class DetalleRecepcion(models.Model): id_proveedor = models.ForeignKey(Proveedor,db_column=''id_proveedor'',primary_key=True, verbose_name=''Proveedor'') anio = models.IntegerField( null=False) mes = models.IntegerField(verbose_name=''Mes'') fecha_recepcion = models.DateField(verbose_name=''Fecha Recepcion'') usuario = models.CharField(max_length=15, blank=True) num_archivos = models.IntegerField(primary_key=True, verbose_name=''No de archivos'') class Meta: managed = False db_table = ''mpc_detalle_recepcion''

ver:

@login_required(login_url=''/login/'') def DetRecView(request): idp = request.GET.get(''i'') anio = request.GET.get(''a'') mes = request.GET.get(''m'') if request.method == ''POST'': r = DetalleRecepcion.objects.get(id_proveedor=idp,anio=anio,mes=mes) form = DetRecForm(request.POST or None, instance =r) if form.is_valid(): form.save() return HttpResponse(''<script type="text/javascript">window.close()</script>'') else: r = DetalleRecepcion.objects.get(id_proveedor=idp,anio=anio,mes=mes) r.usuario = request.user form = DetRecForm(instance=r) return render_to_response(''detrec.html'', {''form'':form}, context_instance=RequestContext(request))

Formar:

class DetRecForm(forms.ModelForm): fecha_recepcion = forms.DateField(widget=DateInput(),) def __init__(self,*args,**kwargs): super(DetRecForm,self).__init__(*args,**kwargs) self.helper = FormHelper(self) self.helper.layout = Layout( Field(''id_proveedor'', ''anio'', ''mes'', ''usuario'', readonly = True ), Fieldset('''', ''fecha_recepcion'', ''num_archivos'', Submit(''save'',''Grabar''), HTML(''<a class="btn btn-danger" id="cerrar">Cancelar</a>'') ) ) class Meta: model = DetalleRecepcion

Utilizo la misma definición de vista y formulario para que otros modelos rindan formularios de edición y con estos otros modelos funciona muy bien y los registros se actualizan. No entiendo lo que sucede. Reescribo el formulario, veo la definición de este modelo y no sé cuál es el problema. La base de datos es una base de datos heredada y las tablas no tienen ningún tipo de relación o restricción. Por cierto, estoy usando Django crujiente

Gracias por adelantado


Si usa el mismo formulario para crear y actualizar vistas, necesita proporcionar un método de limpieza en su campo único y elevar ValidationError cuando existe un objeto.

Pero en su caso, suponiendo que use la clave primaria compuesta en los campos: id_proveedor, num_archivos, debe anular el método limpio de la forma completa:

class DetRecForm(forms.ModelForm): fecha_recepcion = forms.DateField(widget=DateInput()) def __init__(self, *args, **kwargs): super(DetRecForm, self).__init__(*args, **kwargs) self.helper = FormHelper(self) self.helper.layout = Layout( Field(''id_proveedor'', ''anio'', ''mes'', ''usuario'', readonly=True ), Fieldset('''', ''fecha_recepcion'', ''num_archivos'', Submit(''save'', ''Grabar''), HTML(''<a class="btn btn-danger" id="cerrar">Cancelar</a>'') ) ) def clean(self): cleaned_data = super(DetRecForm, self).clean() id_proveedor = self.cleaned_data[''id_proveedor''] num_archivos = self.cleaned_data[''num_archivos''] qs = self.Meta.model.objects.filter(id_proveedor=id_proveedor, num_archivos=num_archivos) if self.instance: qs = qs.exclude(pk=self.instance.id) if qs.count() > 0: raise forms.ValidationError(u''Such object exists!'') return cleaned_data class Meta: model = DetalleRecepcion