[Django][Admin] change_form使用javascript自动填充字段

21 浏览
0 Comments

[Django][Admin] change_form使用javascript自动填充字段

我有点迷茫,不知道该如何继续,经过很多搜索后,我发现我的做法是不正确的。

我的问题是,我有一个类似于这样的报价类模型:

class Offer(models.Model):
    design_hours = models.IntegerField()
    design_price = models.DecimalField(max_digits=10, decimal_places=2)
    devel_hours = models.IntegerField()
    devel_price = models.DecimalField(max_digits=10, decimal_places=2)
    offer_price = models.DecimalField(max_digits=10, decimal_places=2)

其中offer_price是一个计算字段(design_hours * design_price + devel_hours * devel_price),我没有问题覆盖save方法。

class OfferAdmin(VersionAdmin):
    list_display = (
        'design_hours',
        'design_price',
        'devel_hours',
        'devel_price',
        'offer_price')

我想要做的是在添加/更改表单中显示一个不可编辑的字段,当更改design_hours或design_prices表单字段时自动计算。

我猜我需要覆盖change_form.html模板,但是从这里开始我不知道该怎么做:(

谢谢,

0
0 Comments

[Django][Admin] change_form自动填充字段的解决方法

在Django的Admin中,如果你需要保存offer_price字段到数据库中,你可以通过其他模型对象重新计算该字段的值,因为所有必需的字段都已经存在,并且可以保存为对象类的方法。如果你确实需要将该字段保存到数据库中,那么你需要在JavaScript中添加一些事件逻辑,以便在其他输入字段发生更改时更新计算值。

首先,你需要覆盖你的模板。首先正常打印出所有内容,然后可以给offer_price输入字段(或者更好的是,创建一个不是输入字段的新项,比如文本字段)添加disabled标签,然后在底部添加以下脚本(假设在你的模板中已经导入了jQuery):

// 加载jQuery


你需要根据你的模板中的字段名称更改id字段名称。

请确保在服务器端计算并保存offer_price到数据库中,因为恶意用户可以通过将disabled开关切换为enabled来在报价字段中输入任何他们想要的值(参见这个帖子)。最好覆盖ModelForm并排除offer_price字段。不过,希望你可以信任在你的管理界面中的用户,所以可能不需要这样做。

了解一下,仔细考虑一下是否需要将offer_price存储到模型中。解决第一个问题后,我在模板中找到了表单行定义:<form enctype="multipart/form-data" action="" method="post" id="oferta_form" name="oferta_form">并在模板底部添加了以下代码:<script type="text/javascript"> $('#oferta_form input').on('change', recalculate_price); ... 但是JavaScript没有执行。我已经加载了jquery-ui-1.8.22.custom.min.js。

0