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