1

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

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

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 模板但从这里我不知道该怎么做:(

谢谢,

4

1 回答 1

0

你真的需要保存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 字段名称更改为模板中的任何适当字段。

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

于 2013-04-30T18:39:00.973 回答