[Django][Admin] change_form使用javascript自动填充字段
[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模板,但是从这里开始我不知道该怎么做:(
谢谢,
[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。