Django: Как хранить данные в форме №1 при заполнении форм №2 и №3 и автовыбирать данные из форм №2 и №3 в форму №1?

У меня есть форма модели винила (форма №1), которая создает винил со следующими полями: исполнитель (ManyToManyField), название, лейбл записи (ForeignKey), кат.номер, дата выпуска, обложка, цена, жанр, стиль, треклист, количество и состояние. В разделах artist и record label находятся кнопки, позволяющие пользователю создавать новые сущности. При нажатии на кнопку "Добавить нового художника" появляется новая форма (Форма №2), и я хотел бы, чтобы уже добавленные данные в Форме №1 сохранялись, а данные из Формы №2 попадали в Форму №1.

Пример: Артиста, которого я ищу, нет в списке артистов в форме 1. Я нажимаю "Добавить нового исполнителя", и появляется форма №2. Я заполняю данные и при нажатии кнопки "Отправить" перенаправляюсь в форму №1. Я хочу, чтобы новый артист был выбран автоматически. Затем я пишу название. Затем я вижу, что лейбла нет в списке лейблов, поэтому я нажимаю "Добавить новый лейбл". Появляется форма №3, и я заполняю данные. При нажатии на кнопку отправки я перенаправляюсь на форму №1. Я бы хотел, чтобы все ранее добавленные данные, а также только что созданная метка записи были выбраны.

Как я могу этого достичь?

models.py

class Vinyl(models.Model):
    artist = models.ManyToManyField(Artist)
    title = models.CharField(max_length=222)
    cat_number = models.CharField(max_length=20, unique=True, null=True, blank=True)
    release_date = models.DateField(null=True, blank=True)
    price = models.FloatField(validators=[
        MinValueValidator(0.01),
        MaxValueValidator(1000000),
    ], null=True, blank=True)
    record_label = models.ForeignKey(RecordLabel, on_delete=models.CASCADE, null=True, blank=True)
    cover_art = ImageField(upload_to=get_upload_path, null=True, blank=True)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE, null=True, blank=True)
    style = ChainedForeignKey(Style,
                              chained_field='genre',
                              chained_model_field='genre',
                              show_all=False,
                              sort=True,
                              null=True,
                              blank=True)
    tracklist = models.TextField(null=True, blank=True)
    quantity = models.PositiveIntegerField(null=True, default=1)
    condition = models.CharField(max_length=123, choices=Condition.choices(), null=True, blank=True)
    user = models.ForeignKey(AppUser, on_delete=models.CASCADE)

views.py

class SellVinylView(LoginRequiredMixin, views.CreateView):
    template_name = 'sell.html'
    form_class = VinylAddForm
    success_url = '/'

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

forms.py

class VinylAddForm(forms.ModelForm):
    class Meta:
        model = Vinyl
        exclude = ['user']

шаблон

<form method="post" action="{% url 'sell' %}" enctype="multipart/form-data">
        <p>{{ form.artist.label_tag }} {{ form.artist }}</p>
        <p>Artist not in list? <a href="{% url 'artist add' %}?next={{ request.path }}">Add new artist</a></p>
        <p>{{ form.title.label_tag }} {{ form.title }}</p>
        <p>{{ form.record_label.label_tag }} {{ form.record_label }}</p>
        <p>Label not in list? <a href="{% url 'label add' %}?next={{ request.path }}">Add new label</a></p>
        <p>{{ form.cat_number.label_tag }} {{ form.cat_number }}</p>
        <p>{{ form.release_date.label_tag }} {{ form.release_date }}</p>
        <p>{{ form.cover_art.label_tag }} {{ form.cover_art }}</p>
        <p>{{ form.price.label_tag }} {{ form.price }}</p>
        <p>{{ form.genre.label_tag }} {{ form.genre }}</p>
        <p>{{ form.style.label_tag }} {{ form.style }}</p>
        <p>{{ form.tracklist.label_tag }} {{ form.tracklist }}</p>
        <p>{{ form.quantity.label_tag }} {{ form.quantity }}</p>
        <p>{{ form.condition.label_tag }} {{ form.condition }}</p>
        <button>Submit</button>
        {% csrf_token %}
    </form>
Вернуться на верх