Django:根据其他字段更新字段值

Posted

技术标签:

【中文标题】Django:根据其他字段更新字段值【英文标题】:Django: Update Field Value Based on Other Fields 【发布时间】:2011-04-04 00:13:08 【问题描述】:

如果不修改管理界面,我不确定这是否可行。

我有一个名为“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。

【问题讨论】:

无论您使用什么解决方案,如果您不希望用户能够使用自己的价格提交任意值,请注意安全性。 嗯,这个视图将用于“引用”产品列表,因此编辑这些数字的人可以根据需要进行调整。感谢您指出这一点。 【参考方案1】:

您不会轻易将该字段添加到更改列表中,因为它属于正在编辑的模型中的另一个模型。但是,您将能够将直通模型作为内联模型包含在该模型下方,然后您可以简单地编写一些 JS 来获取您的两个输入字段并生成您想要的输出值并将其放入直通模型上的适当字段中包含在 inline 中。

或者,编写一个不依赖管理员的自定义视图;o)

【讨论】:

我不关心更改列表中的那个字段,因为它在代码中显示。它可以作为基本的十进制字段存在。我真正在寻找的是 JS 的一些方向,并将其用于管理视图或开发新视图。【参考方案2】:

关于如何在模型管理中包含 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+)(\d3)/;
    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));
        
    );
);

类似的东西。

刚刚添加了货币格式化功能,以备不时之需。

【讨论】:

感谢您提供资源和函数示例。

以上是关于Django:根据其他字段更新字段值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据Django中相同模型的其他字段ID过滤字段值

在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项

根据值在 Admin 中自定义 Django 表单字段

如何根据其他记录的值更新字段

jQuery X-Editable:根据其他选择字段的值更新选择字段

如何根据具有外键关系的另一个模型更新 Django 模型的字段