【问题标题】:[Django][Admin] change_form auto populated fields with javascript[Django][Admin] change_form 使用 javascript 自动填充字段
【发布时间】:2013-04-24 17:46:55
【问题描述】:

我有点迷茫,不知道如何继续,经过大量搜索后,我认为我做得不对。

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

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),我没有覆盖保存方法的问题。

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

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

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

谢谢,

【问题讨论】:

    标签: javascript django forms templates admin


    【解决方案1】:

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

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

    您需要按照您的想法覆盖您的模板。首先,正常打印所有内容,然后您可以将disabled 标签添加到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 字段名称更改为模板中的任何适当字段。

    确保保存在您的数据库中的报价是在服务器端计算的,因为恶意用户可以通过将禁用开关切换为启用来在报价字段中放置他们想要的任何内容(请参阅this post)最好覆盖 ModelForm 并排除 offer_price 字段。尽管希望您可以信任管理员中的用户,但可能不需要这样做。

    【讨论】:

    • 明白,考虑一下将offer_price存储到模型中可能不需要。解决第一个问题,我已经进入模板行定义: <form enctype="multipart/form-data" action="" method="post" id="oferta_form" name="oferta_form"> </form> 并在模板底部添加 <script type="text/javascript"> $('#oferta_form input').on('change', recalculate_price); ... </script> 但是 javascript 没有被执行。我已经加载了 jquery-ui-1.8.22.custom.min.js
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2016-12-22
    • 2013-01-19
    相关资源
    最近更新 更多