Django表示不保存到DB

时间:2014-07-03 21:16:50

标签: python django

我正在编写一个包含HTML页面的应用程序,该页面必须能够将数据保存到2个模型中。我创建了两个单独的表单并在视图中引用它们,但是信息没有保存到数据库中。

以下是views.py

def nuevoingreso(request):
    if request.method == "POST":
        formingreso = NuevoIngreso(request.POST)
        formprodingreso = NuevoProdIngreso(request.POST)
        if formingreso.is_valid():
            ingreso = formingreso.save(commit=False)
            ingreso.idUser = request.user
            ingreso.Condominio = get_object_or_404(Condominios, idCondominio=request.session["idCondominio"])
            ingreso.save()
            ingresoprod = formprodingreso.save()
            for i in range(5):
                if ProductosIngresos.SubtotalP != "" and ProductosIngresos.IvaP != "" and ProductosIngresos.TotalP != "":
                    ingresoprod.ProductosIngresos(Concepto=request.POST.get("Concepto"+str(i), ""), SubtotalP=request.POST.get("SubtotalP"+str(i), ""), IvaP=request.POST.get("IvaP"+str(i), ""), TotalP=request.POST.get("TotalP"+str(i), ""))
            ingresoprod.save()
            return HttpResponseRedirect("/propiedades/")
        else:
            return render(request, "immovelc/nuevoingreso.html",
                          {"formingreso": formingreso, "formprodingreso": formprodingreso})
    propiedadesing = PropiedadesCond.objects.all()
    context = ({"propiedadesing": propiedadesing})
    return render(request, "immovelc/nuevoingreso.html", context)

forms.py

class NuevoIngreso(ModelForm):
    class Meta:
        model = Ingresos
        fields = ["Numero", "Persona", "Fecha", "Observaciones", "Cobrado", "Subtotal", "Iva", "Total"]
        def clean(self):
            Numero = self.cleaned_data["Numero"]
            Persona = self.cleaned_data["Persona"]
            Fecha = self.cleaned_data["Fecha"]
            if not Numero:
                raise forms.ValidationError("El campo de numero es obligatorio")
            if not Persona:
                raise forms.ValidationError("El campo de cliente es obligatorio")
            if not Fecha:
                raise forms.ValidationError("El campo de fecha es obligatorio")

class NuevoProdIngreso(ModelForm):
    class Meta:
        model = ProductosIngresos
        fields = ["Concepto", "SubtotalP", "IvaP", "TotalP"]

models.py

class Ingresos(models.Model):
    idIngreso = models.AutoField(primary_key=True, null=False, max_length=15)
    idCondominio = models.ForeignKey(Condominios)
    idUser = models.ForeignKey(User)
    Numero = models.CharField(max_length=100)
    Persona = models.CharField(max_length=250, default="Ninguno")
    Cobrado = models.CharField(max_length=100, default=0)
    Observaciones = models.TextField(default="Ninguna")
    Fecha = models.DateField()
    Subtotal = models.CharField(max_length=100)
    Iva = models.CharField(max_length=100)
    Total = models.CharField(max_length=100)
    def __unicode__(self):
        return unicode(self.idIngreso)

class ProductosIngresos(models.Model):
    idProductoIngreso = models.AutoField(primary_key=True, null=False, max_length=15)
    idIngreso = models.ForeignKey(Ingresos)
    Concepto = models.CharField(max_length=500)
    SubtotalP = models.CharField(max_length=100)
    IvaP = models.CharField(max_length=100)
    TotalP = models.CharField(max_length=100)
    def __unicode__(self):
        return unicode(self.idProductoIngreso)

谢谢!

1 个答案:

答案 0 :(得分:0)

没有冒犯,但这段代码远非正确。

除此之外,您还有许多错误可能需要删除。

错误:

  • formprodingreso.is_valid()永远不会被称为
  • for i in range(5)内你使用一个类就好像它是一个实例(ProductosIngresos.SubtotalP
  • 形式中的
  • clean方法必须在Meta块之外

我相信你想要的循环内容是:

producto_ingreso = ProductosIngresos()
producto_ingreso.idIngreso = ingreso # better change to producto_ingreso.ingreso
producto_ingreso.Concepto=request.POST.get("Concepto"+str(i), "") # producto_ingreso.concepto
producto_ingreso.SubtotalP=request.POST.get("SubtotalP"+str(i), "") # producto_ingreso.subtotal_p
producto_ingreso.IvaP=request.POST.get("IvaP"+str(i), "")
producto_ingreso.TotalP=request.POST.get("TotalP"+str(i), ""))
producto_ingreso.save()

为了使它更清晰,你可以让这个逻辑之王覆盖ModelForm的save()方法。或者使用内联formsets

混乱:

  • 模型FK是Django中的对象,而不是整数。更好地将它们命名为condominio而不是idCondominio
  • 十进制列(小计,iva,总计)应声明为deciaml,即models.DecimalField(max_digits=10, decimal_places=2)
  • clean方法用于交叉字段验证(多个字段)。 clean_numero f.e。
  • 只能验证一个字段

过度复杂化:

  • 模型默认具有ID / PK,无需明确它们(引用为self.idself.pk
    • 模型unicode函数未提供任何信息
    • clean和ValidationError是超级的:modelform检查属性是否自动需要

会议错误:

  • 属性始终为write_in_lowercase(SubtotalP - > subtotal_p)

如果您不希望维护您的代码的开发人员讨厌您并对您做出一些伏都教,我会认真尝试解决所有这些问题。

相关问题