Как создать поле формы для нескольких моделей в 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 создан для одной модели, а не для нескольких