Django 表单和 javascript 或者其他方式来做同样的事情

Posted

技术标签:

【中文标题】Django 表单和 javascript 或者其他方式来做同样的事情【英文标题】:Django forms and javascript or maybe some other way to do the same 【发布时间】:2014-09-10 07:49:27 【问题描述】:

我对此有疑问。我有一个基于此模型的 ModelForm 调用 FacturaForm:

class Factura(models.Model):
    TIPO_FACTURA = (
        ('A', 'A'),
        ('E', 'E')
        )
    RESPONSABLE = (
        ('Responsable Inscripto', 'Responsable Inscripto'),
        ('Responsable No Inscripto', 'Responsable No Inscripto')
        )
    tipo_Factura = models.CharField(max_length=1, choices= TIPO_FACTURA)
    nombre_cliente = models.ForeignKey(Cliente)
    fecha_factura = models.DateField()
    RI = models.CharField(max_length=50, choices= RESPONSABLE)
    numero_De_Factura = models.IntegerField(max_length=50)
    descripcion = models.CharField(max_length=140)
    importe_Total= models.FloatField()
    iva = models.FloatField()
    importe_sin_iva = models.FloatField()

所以现在我有了带有字段的表单,以便用户可以完成它们。但我有一个问题。有一个名为“importe_sin_iva”的表单字段,这是用户要输入一个数字,但也有一个名为“iva”的字段,该字段应该计算一个数字(“importe_sin_iva”* 0.21)和什么用户希望在“importe_sin_iva”字段上写一个数字,系统会自动计算乘法的结果并用它填充框。还有“importe_Total”字段必须做类似的事情,但这次它必须添加(+)“importe_sin_iva”+“iva”字段并用结果填充这个框

我的问题是:有没有合适的方法在 django 表单上执行此操作?或者可以用javascript完成吗?如果它必须用 javascript 完成,任何人都可以给我一个关于如何做这件事的提示,因为我从未接触过 javascript。

如果您认为我应该更改模型,请告诉我。

如果您有任何其他解决方案,我们将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

如果您想在用户填写表单时向他显示这些值,您将需要 JavaScript。至少我不知道任何其他客户端技术可以做到这一点。您真正的大问题是将数据持久化到数据库中。您不能依赖客户端将正确的值保存在数据库中。为此,您可以覆盖模型的保存方法。这是一个简单的例子:

def save(self, *args, **kwargs):
    self.iva = self.importe_sin_iva * 0.21
    self.importe_Total = self.iva + self.importe_sin_iva
    super(Factura, self).save(*args, **kwargs)

在表单中,您可以使用事件“onchange”即时更新相应的字段。 jQuery 框架非常适合这一点。 您的函数可能如下所示:

$('#importe_sin_iva').change(function() 
    var importe_sin_iva = $(#importe_sin_iva).val()
    var iva = importe_sin_iva * 0.21
    $('#iva').val(iva)
    var total = importe_sin_iva + iva
    $('#total').val(total)
);

这也是一个简单的示例,其中 importe_sin_iva、iva 和 importe_Total 的输入字段的 ID 分别为 importe_sin_iva、iva 和 total。不应将字段 iva 和 total 保存到数据库中。您不能依赖客户端技术来验证值。

你仍然需要学习如何使用 jQuery,如何将它绑定到你的 html 等等。我希望这些简单的例子可以为你指明方向。

【讨论】:

你好塞萨尔。一个问题:当我覆盖 save() 时,我必须实例化所有模型字段还是只使用您建议的模型字段?感谢您的回复 谢谢哥们。我按照你的建议做了,效果很好。谢谢!。 很好。不客气,我很高兴能帮助你。如您所见,使用您的代码并尝试不同的东西是一种方法。

以上是关于Django 表单和 javascript 或者其他方式来做同样的事情的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中获取django表单值而不将其保存到模型中

如何使用 javascript 而不是 Django 会话将表单数据(Django 表单)存储到浏览器的本地存储?

在 html 页面内的 javascript 中访问 django 表单变量

将 Javascript 计算传递给 Django 后端

在 Django 中是不是有一种惯用的方法来编写不显眼的 JavaScript 和/或进行 AJAX 表单提交?

Django 表单未使用 Javascript 提交