Как определить поле модели, чтобы иметь возможность выбора из другого поля другой модели другого приложения?

У меня есть две модели, определенные в двух разных приложениях. Я хочу иметь возможность выбора для определенного поля в модели, которое получает атрибуты из другого поля модели в другом приложении.

Например: у меня есть модель "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
Вернуться на верх