Как автоматически заполнить поле в django, когда значение выбрано из выпадающего меню в другом поле в формах?

У меня есть две модели, которые находятся в двух разных приложениях; Invoice и Inventory.

InvoiceModel:

class Invoice(models.Model):
    line_one = models.ForeignKey(Inventory, to_field='title', on_delete=models.CASCADE, default='', blank=True, null=True, related_name='+', verbose_name="Line 1")
    line_one_unit_price = models.IntegerField('Unit Price(₹)', default=0, blank=True, null=True)
    line_one_quantity = models.IntegerField('Quantity', default=0, blank=True, null=True)
    line_one_total_price = models.IntegerField('Line Total', default=0, blank=True, null=True)

Invoice.line_one ссылается на Inventory.title

InventoryModel:

class Inventory(models.Model):
  product_number = models.IntegerField(blank=True, null=True)
  product = models.TextField(max_length=3000, default='', blank=True, null=True)
  title = models.CharField('Title', max_length=120, default='', blank=True, null=True, unique=True)
  amount = models.IntegerField('Unit Price', default=0, blank=True, null=True)

  def __str__(self):
      return self.title

По сути, пользователь добавляет товар с помощью модели Inventory, а затем в модели Invoice у него будет выпадающее меню для line_one и когда он нажимает на определенный товар, Я хочу, чтобы line_one_unit_price заполнялся ценой товара, выбранного в опции line_one!

InvoiceForm:

class InvoiceForm(forms.ModelForm):
    line_one_unit_price = forms.CharField(widget=forms.Select, label="Unit Price(₹)")
    
    class Meta:
      model = Invoice
      fields = ['line_one',#...]
    
      def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['line_one_unit_price'].widget.choices = [(i.amount, i.amount) for i in Inventory.objects.all()]

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

Скриншот: screenshot

На изображении количество первого товара добавляется автоматически, но вместо этого я хочу, чтобы по умолчанию оно было "-----". Как я могу это реализовать? Спасибо.

Есть разные способы сделать это, но по сути нет встроенного простого способа. Вам необходимо использовать JavaScript на внешнем интерфейсе, чтобы определить, когда поле "Строка 1" изменяется, и затем заполнить "Цену за единицу товара" соответствующим образом.

Если у вас не слишком много элементов "Line 1", один из способов сделать это - создать свой собственный виджет для встраивания цены в каждый <option> выпадающий элемент с атрибутом data-. Затем вы включаете JavaScript, который определяет, когда выпадающий список изменился, и обновляет поле "Цена за единицу", доступное только для чтения. На обратной стороне вы также должны убедиться, что вы не используете это поле формы и ищете цену на основе поля "Строка 1".

Другой вариант - сделать AJAX вызов конечной точки для получения цены.

EDIT: Если есть несколько выпадающих списков с одинаковым списком товаров, то лучше всего подойдет глобальная JS-переменная с поиском цены (если она не слишком большая). Создайте поиск dict от product_number до amount (цена), передайте его шаблону для вывода в виде JSON в глобальной переменной, а затем используйте его в JavaScript для заполнения "Unit Price".

Вернуться на верх