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>