Django: обновить значение поля на основе других полей - PullRequest
1 голос
/ 26 августа 2010

Я не уверен, что это возможно даже без изменения интерфейса администратора.

У меня есть модель под названием «Цитата», которая может содержать несколько моделей «Продукт». Я соединяю два, используя промежуточную модель "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 ]

3 голосов
/ 26 августа 2010

Информация о том, как включить 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));
        }
    });
});

Нечто подобное.

Просто добавили функцию форматирования валюты на тот случай, если вы захотите ее использовать.

0 голосов
/ 26 августа 2010

Вы не сможете легко вставить это поле в список изменений, потому что оно принадлежит другой модели из той, которая редактируется.Тем не менее, вы сможете включить сквозные модели в качестве встроенных ниже этой модели, а затем вы можете просто написать JS, который берет два ваших поля ввода и генерирует желаемое выходное значение и помещает его в соответствующее поле сквозной моделиэто включено в строку.

Или напишите пользовательское представление, которое не зависит от администратора; o)

...