如果不修改Admin界面,我不确定这是否可行。
我有一个名为“Quote”的模型,可以包含多个“Product”模型。我使用中间模型“QuoteIncludes”连接两者。以下是目前的三种型号:
class Product(models.Model):
name = models.CharField(max_length=100)
short_desc = models.CharField(max_length=200)
default_cost = models.DecimalField(max_digits=15, decimal_places=2)
default_price = models.DecimalField(max_digits=15, decimal_places=2)
shipping_per_unit = models.DecimalField(max_digits=9, decimal_places=2)
weight_in_lbs = models.DecimalField(max_digits=5, decimal_places=2)
def __unicode__(self):
return self.name
class Quote(models.Model):
## Human name for easy reference
name = models.CharField(max_length=100)
items = models.ManyToManyField(Product, through='QuoteIncludes')
def __unicode__(self):
return self.name
class QuoteIncludes(models.Model):
## Attach foreign keys between a Quote and Product
product = models.ForeignKey(Product)
quote = models.ForeignKey(Quote)
## Additional fields when adding product to a Quote
quantity = models.PositiveIntegerField()
per_unit_cost = models.DecimalField(max_digits=15, decimal_places=2)
per_unit_price = models.DecimalField(max_digits=15, decimal_places=2)
def _get_extended_price(self):
"""Gets extended price by multiplying quantity and unit price."""
if self.quantity and self.per_unit_price:
return self.quantity * self.per_unit_price
else:
return 0.00
extended_price = _get_extended_price
我希望能够做的是在管理界面中创建一个引号,这样当我填写订单项的数量和per_unit_price时,它会填写“extended_price”作为当我选中这两个时。我认为它需要在那里添加一些AJAX。
答案 0 :(得分:3)
有关如何在模型管理员中包含js的信息: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#modeladmin-media-definitions
例如:
class Media:
js = (
'http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js',
'/media/js/calculate.js',
)
你的脚本看起来像这样:
function currencyFormat(nStr) {
nStr += '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + '.' + '$2');
}
return x1 + x2;
}
jQuery(document).ready(function($){
$('input[id$=quantity], input[id$=per_unit_cost]').live('keyup', function() {
var $tr = $(this).parents('tr');
var quantity = parseInt($tr.find('input[id$=quantity]').val());
var count = parseInt($tr.find('input[id$=per_unit_cost]').val());
if(quantity && count) {
$tr.find('input[id$=per_unit_price]').html(currencyFormat(quantity * count));
}
});
});
类似的东西。
只需添加货币格式功能,以防您想使用它。
答案 1 :(得分:0)
您不会轻易将该字段输入到更改列表中,因为它属于正在编辑的另一个模型。但是,您可以将直通模型作为内联函数包含在此模型下面,然后您可以简单地编写一些JS,它将获取您需要的两个输入字段并生成所需的输出值,并将其插入到直通模型的相应字段中它包含在内联中。
或者,编写一个不依赖于管理员的自定义视图; o)