Django:基于其他字段更新字段值

时间:2010-08-25 23:04:34

标签: python django methods django-admin admin

如果不修改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。

Annotated picture describing what I would like

2 个答案:

答案 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)