0

我有一个包含“价格”、“税”和“折扣”字段(IntegerFields)的表单。然后还有一个名为“total_price”的只读字段。

当我们输入“价格”、“折扣”和“税”时,应该会自动显示“总价格”值。如果我们更改“折扣”或“价格”,那么“总价格”也会立即更改。

看到最终价格后,我们可以点击“保存”按钮。

如何在 Django admin 中实现这一点?

4

1 回答 1

1

为此,您必须将自定义 Javascript 代码添加到您的管理页面。

以下是您可以执行的操作:

  1. 将只读字段添加到管理员 - 它将显示“total_price”
  2. 将自定义脚本添加到管理页面。
  3. 编写 JS 脚本 - 此脚本将“实时更新”总价

您的管理员可能如下所示:

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):

    # some code here...

    readonly_fields = ('total_price', )

    def total_price(self, obj):
        # return whatever initial value you want
        return obj.price - obj.price*obj.discount

    # This is important - adding custom script to admin page
    @property
    def media(self):
        media = super().media
        media._js.append('js/your-custom-script.js')
        return media

请记住,它js/your-custom-script.js必须在您的静态文件文件夹中。

更新:您可以使用嵌套类media包含您的 JS, 而不是覆盖属性:Meta

class YourModelAdmin(admin.ModelAdmin):
    ...
    class Media:
        js = (
            'path-to-your-static-script-file.js',
        )

最后一步是编写脚本以total_price在其他字段发生更改时更新字段的值。

示例:如果您想在更改total_priceprice更改,您的脚本可以如下所示:

if (!$) {
    $ = django.jQuery;
}
$(document).ready(function(){
    // Add event listener to "price" input
    $("#id_price").change(function(e){
        // Get entered value
        let price = parseFloat($(this).val());

        // Get discount value from another field 
        let discount = parseFloat($("#id_discount").val())

        // Compute total price in whatever way you want
        let total_price = price - price*discount;

        // Set value in read-only "total_price" field.
        $("div.field-total_price").find("div.readonly").text(total_price);
    });
})

如果您想在更改或字段更改total_price时进行更新,只需向它们添加事件侦听器。discounttax

于 2020-03-31T12:02:54.757 回答