Django表单插入记录而不是更新记录

2024-06-28 20:40:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试更新Django中的某些记录时遇到一些问题: 当我试图更新一些记录时,应用程序会插入一个新的记录,我不知道我为什么会有这种行为。在

型号

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'

视图:

^{pr2}$

形式:

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

我对其他模型使用相同的视图和表单定义来呈现编辑表单,其他模型的效果很好,记录也会更新。 我不明白发生了什么事。 我重写了这个模型的表单,视图定义,我不知道是什么问题。 数据库是一个遗留数据库,表没有任何关系或约束。 顺便说一下,我用的是Django crispy

提前谢谢


Tags: name模型self视图idtrueverbosemodels
2条回答

比如用pk获取object

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

若您使用相同的表单来创建和更新视图,那个么您需要在您的唯一字段上提供clean方法,并在对象存在时引发ValidationError。在

但在您的例子中,假设您在字段上使用复合主键:id_proveedor,num_archivos,您应该覆盖整个表单的clean方法:

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

相关问题 更多 >