2010-08-25 3 views
0

Я не уверен, что это возможно даже без изменения интерфейса администратора.Django: обновить значение поля на основе других полей

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

То, что я хотел бы быть в состоянии сделать, это создать Quote в интерфейсе администратора, так что когда я заполнил как количества, так и per_unit_price из позиции, она заполняет «extended_price» как произведение двух, когда я перехожу на вкладку. Я думаю, что это требует добавления AJAX.

Annotated picture describing what I would like

+0

Независимо от того, какое решение вы используете, будьте осторожны с безопасностью, если вы не хотите, чтобы пользователи могли отправлять произвольные значения с их собственными ценами. – user27478

+0

Ну, это представление будет для «цитирования» списка продуктов, поэтому умышленно, чтобы человек, редактировавший это число, смог при необходимости скорректировать их. Спасибо, что указали на это. – akoumjian

ответ

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)); 
     } 
    }); 
}); 

Что-то в этом роде.

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

+0

Спасибо, как за ресурсы, так и за примеры функций. – akoumjian

0

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

Или написать пользовательский вид, что не наклоняться на админа; о)

+0

Меня не интересует это поле в списке изменений, поскольку оно представлено в коде. Он может существовать как базовое десятичное поле. То, что я действительно ищу, - это какое-то направление с JS и использование этого либо с видом администратора, либо при разработке нового представления. – akoumjian

Смежные вопросы