我有点失落,不知道如何继续,经过大量的搜索,我认为我做得不对。
我的问题是我有一个像这样的优惠类模型:
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模板,但是从这里我不知道该怎么做:(
谢谢,
答案 0 :(得分: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字段名称更改为模板中的相应字段。
确保数据库中保存的优惠价格是在服务器端计算出来的,因为恶意用户可以通过将已停用的开关翻转为已启用来在提供价格字段中放置他们想要的任何内容(请参阅this post) d最好覆盖ModelForm并排除offer_price字段。虽然希望您可以信任管理员中的用户,但这可能不是必需的。