I create several forms to edit some records. When I save the form, I can see in the database that the application update the record and insert one or two record more.
All the forms that I use to update record have this weird behavior. I don't know if the error is in the form definition or in the view definition.
Model
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'
View
@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))
Form
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
I am using a legacy database, I check the constrains, procedure, triggers of the database and everything look fine. Beside the table don't use any procedure function etc.
And only when I update or insert from the application I can see this behavior.
UPDATE
urls.py
urlpatterns = patterns('',
    url(r'^recepcion/$','prov.views.DetRecView',name='recepcion'),
    url(r'^newdetrec/$','prov.views.NewDetRecView',name='newdetrec'),
    url(r'^master/$','prov.views.NewMasterView',name='master'),
    url(r'^conci/$', 'prov.views.ConciView',name='conci'),
    url(r'^carga/$', 'prov.views.CargaView',name='carga'),
    url(r'^gencert/$', 'prov.views.GenCertView',name='gencert'),
    url(r'^entcert/$', 'prov.views.EntCertView',name='entcert'),
    url(r'^aceptacert/$', 'prov.views.AceptaCertView',name='aceptacert'),
    url(r'^envconci/$', 'prov.views.EnvConciView',name='envconci'),
)
My create view (for the same model)
  @login_required(login_url='/login/')
    @permission_required('prov.views.configView',login_url='/login/')
    def NewDetRecView(request):
        form = NewDetRecForm(request.POST or None)
        if request.method == 'POST':
           idp = request.POST['id_proveedor']
           a = request.POST['anio']
           m = request.POST['mes']
           id = Proveedor.objects.get(id_proveedor=idp)
           obj,created = DetalleRecepcion.objects.get_or_create(id_proveedor=id,anio=a,mes=m)
           obj.save()
           return HttpResponseRedirect('/monitor/')
           if not created:
              obj.id_proveedor = id
              obj.anio = a
              obj.mes = m
              obj.save()
              return HttpResponseRedirect('/monitor/')
        return render_to_response('newdetrec.html',
                              {'form':form})
My form class to create new records:
class NewDetRecForm(forms.ModelForm):
      def __init__(self,*args,**kwargs):
       super(NewDetRecForm,self).__init__(*args,**kwargs)
       self.helper = FormHelper(self)
       self.helper.layout.append(Submit('save','Grabar'))
       self.helper.layout = Layout(
        Fieldset('',
                 'id_proveedor',
                 'anio',
                 'mes',
                 Submit('save','Grabar'),
                )
       )
      def clean(self):
        cleaned_data = super(NewDetRecForm, self).clean()
        id_proveedor = self.cleaned_data['id_proveedor']
        #num_archivos = self.cleaned_data['num_archivos']
        anio = self.cleaned_data['anio']
        mes = self.cleaned_data['mes']
        qs = self.Meta.model.objects.filter(id_proveedor=id_proveedor, anio=anio, mes=mes)
        if self.instance:
            qs = qs.exclude(pk = self.instance.pk)
        if qs.count() > 0:
            raise forms.ValidationError(u'Registro ya existente')
        return cleaned_data
      class Meta:
        model = DetalleRecepcion
DetRecForm is for update
DetRecView is for update
NewDetRecForm is for create
NewDetRecView is for create
UPDATE 2
javascript function to pass parameters
<script type="text/javascript">
  $(document).ready ( function () {
    $(document).on ("click", "#recepcion", function (event) {
        event.preventDefault();
        var tbl = document.getElementById("myTable");
        var idpro = $(this).parents('tr:first').find('td:first').text();
        var anio = $(this).closest('tr').children(":eq(1)").text();
        var mes = $(this).closest('tr').children(":eq(2)").text();
        var argu = "?i="+idpro+"&a="+anio+"&m="+mes;
        //window.location = "/recepcion/"+argu;
        var url = "/recepcion/"+argu;
        window.open(url,'_blank')
    });
});
</script>
I know this isn't the right way to pass parameters to the templates. I am start learning AJAX to pass the data, but meanwhile I use this horrible function
 
    