我有一个包含“价格”、“税”和“折扣”字段(IntegerFields)的表单。然后还有一个名为“total_price”的只读字段。
当我们输入“价格”、“折扣”和“税”时,应该会自动显示“总价格”值。如果我们更改“折扣”或“价格”,那么“总价格”也会立即更改。
看到最终价格后,我们可以点击“保存”按钮。
如何在 Django admin 中实现这一点?
我有一个包含“价格”、“税”和“折扣”字段(IntegerFields)的表单。然后还有一个名为“total_price”的只读字段。
当我们输入“价格”、“折扣”和“税”时,应该会自动显示“总价格”值。如果我们更改“折扣”或“价格”,那么“总价格”也会立即更改。
看到最终价格后,我们可以点击“保存”按钮。
如何在 Django admin 中实现这一点?
为此,您必须将自定义 Javascript 代码添加到您的管理页面。
以下是您可以执行的操作:
您的管理员可能如下所示:
@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_price
时price
更改,您的脚本可以如下所示:
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
时进行更新,只需向它们添加事件侦听器。discount
tax