2013-04-30 108 views
1

我有点迷路,不知道如何继续,经过大量搜索后,我认为我没有正确地做到这一点。[Django] [Admin] change_form使用javascript自动填充字段

我的问题是,我有一个提议类模型像这样的:

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形成字段时是在添加/更改表单显示一个不可编辑的字段至极自动计算。

我supose,我必须覆盖change_form.html模板,但在这里,我不知道该怎么办:(

感谢,

回答

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)将任何他们想要的东西放在报价区域中覆盖ModelForm并排除offer_price字段。尽管希望您可以信任管理员中的用户,但这可能不是必需的。

+0

了解,稍微考虑将offer_price存储到模型中可能不需要。 解决的第一个问题,我有到模板表格线的定义:

并在模板