[Django][Admin]使用javascript更改表单自动填充的字段

[Django][Admin]使用javascript更改表单自动填充的字段,javascript,django,forms,templates,admin,Javascript,Django,Forms,Templates,Admin,我有点迷路了,不知道如何继续,经过多次搜索,我认为我做得不对 我的问题是,我有一个类似这样的报价类模型: class Offer(models.Model): design_hours = models.IntegerField() design_price = models.DecimalField(max_digits=10, decimal_places=2) devel_hours = models.IntegerField() devel_price =

我有点迷路了,不知道如何继续,经过多次搜索,我认为我做得不对

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

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是一个计算字段desig_hours*design_price+devel_hours*devel_price,那么覆盖save方法不会有问题

class OfferAdmin(VersionAdmin):
    list_display = (
        'design_hours',
        'design_price',
        'devel_hours',
        'devel_price',
        'offer_price')
我想做的是在添加/更改表单中显示一个不可编辑的字段,该字段在更改设计工时或设计价格表单字段时自动计算

我想我必须覆盖change_form.html模板,但从这里我不知道该怎么做:


谢谢,

您真的需要在数据库中保存报价吗?它总是可以从任何模型对象重新计算,因为所有必需的字段都在那里,并且可以保存为对象类的方法

如果您决定确实需要在数据库中保存此字段,则需要在javascript中添加某种事件逻辑,以便在其他输入更改时更新计算值

您需要按照您的想法覆盖模板。首先,正常打印所有内容,然后您可以向offer_price输入字段添加一个禁用的标记,或者更好,创建一个非输入的新项目,例如文本字段,然后在底部添加此脚本,假设jQuery已导入模板中:

    // load jQuery
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script>
        // when any input in this form changes, call recalculate price
        $('#form_name input').on('change', reclaculate_price);

        var reclaculate_price = function(){
          // whatever your logic is for calculating the offer price
          var value = $('#design_hours').val() * $('#design_price').val();
          // Add some error checking here to ensure the price is valid
          // Set the value to you field
          $('#offer_price').val(value);
        }
    </script>
您需要将id字段名称更改为模板中的任何适当字段


确保保存在数据库中的报价是在服务器端计算的,因为恶意用户可以通过将禁用的开关翻转到启用状态,在报价字段中放入他们想要的任何内容。查看最好覆盖模型表单并排除报价字段。虽然希望您可以信任管理员中的用户,因此这可能不是必需的。

了解,稍微考虑一下将报价存储到模型中可能不需要。为了解决第一个问题,我在模板中加入了表单行定义:并在模板$'oferta\u form input'的底部添加了。在'change'上,重新计算价格。。。但是javascript没有被执行。我已经加载了jquery-ui-1.8.22.custom.min.js