Как создать поле формы для нескольких моделей в Django?

Пытался разобраться в этом самостоятельно, но зашел в тупик -

Я работаю над проектом crm для изучения Django и застрял, пытаясь включить действия между пользователем и клиентом. В частности, я пытаюсь сделать возможным запись взаимодействия по электронной почте и чтобы поля from/to ссылались либо на модель пользователя, либо на модель клиента. То есть, по сути, электронное письмо может быть записано как от пользователя к клиенту или наоборот. Следующей частью будет возможность отметить нескольких клиентов или пользователей в соответствующих полях этого взаимодействия.

Я попробовал включить поля to и from в качестве моделей, чтобы они могли использовать класс GenericForeignKey следующим образом:

class Activity(models.Model):
    owner = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    date = models.DateTimeField()

class EmailTo(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type')

class EmailFrom(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type')

class EmailActivity(Activity):
    emailto = models.ForeignKey(EmailTo, on_delete=models.DO_NOTHING)
    emailfrom = models.ForeignKey(EmailFrom, on_delete=models.DO_NOTHING)
    body = models.TextField(blank=True)

но теперь я застрял, пытаясь понять, как представить это на форме. Я подумал, что можно использовать объединение для объединения двух запросов в одно поле с помощью ModelMultipleChoiceField:

class EmailActivityForm(forms.ModelForm):
    emailto = forms.ModelMultipleChoiceField(
        queryset=Client.objects.all().union(User.objects.all()), 
        label="To")
    emailfrom = forms.ModelMultipleChoiceField(
        queryset= Client.objects.all().union(User.objects.all()), 
        label="From")
    body = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = EmailActivity
        exclude = '__all__'

но теперь видим, что это невозможно, так как запросы не одинакового размера.

Я начинаю думать, что мне нужно вернуться к моим пользовательским моделям и сделать так, чтобы пользователи и клиенты наследовались от одной модели "Person" или чего-то подобного. Хотел сначала проверить здесь, чтобы узнать, возможно, я что-то упустил.

лучше написать свою собственную форму руководства

class EmailActivityForm(forms.Form):
    emailto = forms.ModelMultipleChoiceField(queryset=Client.objects.all().union(User.objects.all()), label="To")
    emailfrom = forms.ModelMultipleChoiceField(queryset= Client.objects.all().union(User.objects.all()), label="From")
    body = forms.CharField(widget=forms.Textarea)

и продолжайте, используя все оставшиеся поля.

Кстати, forms.ModelForms создан для одной модели, а не для нескольких

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