Как определить поле модели, чтобы иметь возможность выбора из другого поля другой модели другого приложения?
У меня есть две модели, определенные в двух разных приложениях. Я хочу иметь возможность выбора для определенного поля в модели, которое получает атрибуты из другого поля модели в другом приложении.
Например: у меня есть модель "Inventory", которая имеет поле 'title'.
class Inventory(models.Model):
title = models.CharField('Title', max_length=120, default='')
....
У меня также есть другая модель 'Invoice', которая имеет поле 'line_one'. Обе эти модели находятся в разных приложениях.
class Invoice(models.Model):
line_one = models.CharField('Line 1', max_length=120)
....
Я создал Django-форму для добавления деталей счета-фактуры. Мне нужна опция выбора для line_one, которая имеет все значения, хранящиеся в поле Inventory.title, чтобы пользователь мог выбрать только эти значения из выпадающего меню. Как я могу это реализовать? Спасибо.
Используйте CharField
для line_one
class Inventory(models.Model):
title = models.CharField('Title', max_length=120, default='')
# ...
class Invoice(models.Model):
line_one = models.CharField('Line 1', max_length=120)
# ...
class InvoiceForm(forms.ModelForm):
line_one = forms.CharField(widget=forms.Select)
class Meta:
model = Invoice
fields = ['line_one', ] # ...
def __init__(*args, **kwargs):
super().__init__(*args, **kwargs)
# populate the choices from the Inventory model objects
self.fields['line_one'].widget.choices = [(i.title, i.title) for i in Inventory.objects.all()]
# or
self.fields['line_one'].widget.choices = [(t,t) for t in Inventory.objects.values_list('title', flat=True)
Используйте ForeignKey
для line_one
Если вы хотите использовать ForeignKey
, необходимо иметь уникальные значения для Inventory.title
.
class Inventory(models.Model):
title = models.CharField('Title', max_length=120, default='')
# ...
# The __str()__ method of an object is used by django
# to generate the labels for a Select input widget
def __str__(self):
return self.title
class Invoice(models.Model):
line_one = models.ForeignKey(Inventory, to_field='title', on_delete=models.CASCADE)
# ...
class InvoiceForm(forms.ModelForm):
class Meta:
model = Invoice
fields = ['line_one', ] # ...
# no need for any form adjustments,
# as django uses a select input as default for ForeignKey fields