Как автоматически заполнить поле в 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.
На изображении количество первого товара добавляется автоматически, но вместо этого я хочу, чтобы по умолчанию оно было "-----". Как я могу это реализовать? Спасибо.
Есть разные способы сделать это, но по сути нет встроенного простого способа. Вам необходимо использовать JavaScript на внешнем интерфейсе, чтобы определить, когда поле "Строка 1" изменяется, и затем заполнить "Цену за единицу товара" соответствующим образом.
Если у вас не слишком много элементов "Line 1", один из способов сделать это - создать свой собственный виджет для встраивания цены в каждый <option>
выпадающий элемент с атрибутом data-
. Затем вы включаете JavaScript, который определяет, когда выпадающий список изменился, и обновляет поле "Цена за единицу", доступное только для чтения. На обратной стороне вы также должны убедиться, что вы не используете это поле формы и ищете цену на основе поля "Строка 1".
Другой вариант - сделать AJAX вызов конечной точки для получения цены.
EDIT: Если есть несколько выпадающих списков с одинаковым списком товаров, то лучше всего подойдет глобальная JS-переменная с поиском цены (если она не слишком большая). Создайте поиск dict
от product_number
до amount
(цена), передайте его шаблону для вывода в виде JSON в глобальной переменной, а затем используйте его в JavaScript для заполнения "Unit Price".