Django, в одну форму поля нескольких моделей
Изучаю Django и в продолжении моего предыдущего вопроса ещё один вопрос:
есть две модели:
models.py
class Person(models.Model):
name = models.CharField(max_length=50)
class Phone(models.Model):
phone = models.CharField(max_length=10)
person = ForeignKey(Person, on_delete=models.CASCADE)
создать просто Персону не трудно
forms.py
class PersonAddForm(forms.ModelForm):
class Meta:
model = Person
fields = '__all__'
views.py
class AddPerson(CreateView):
model = Person
form_class = PersonAddForm
template_name = "person_add.html"
def success_url(self):
return redirect("/person/")
def form_valid(self, form):
form.save()
return redirect("/person/")
person_add.html
{% block content %}
<p>Add New Person
<form action="" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Create New</button>
</form>
{% endblock %}
А как можно сделать так, чтобы с добавлением новой Персоны можно было бы сразу добавлять телефоны в этой же форме? Наверное правильно сказать один телефон (одно поле в модели), а хотелось бы чтобы сразу можно сколько нужно телефонов добавлять (типа нажимая кнопку "добавить номер" и появляется ещё одно поле на форме для ввода)
Спасибо!
Ответы (1 шт):
Вот такое решение я нашёл. Как я понимаю оно не самое оптимальное и правильное. Правильно использовать InlineFormSet_factory, но как это правильно делать я так и не понял Привожу того, как у меня получилось
models.py
class Person(models.Model):
name = models.CharField(max_length=50)
class Phone(models.Model):
phone = models.CharField(max_length=10)
person = ForeignKey(Person, on_delete=models.CASCADE)
forms.py
class PersonForm(ModelForm):
class Meta:
model = Person
fields = ('name',)
class PhoneForm(ModelForm):
class Meta:
model = Phone
fields = ('phone',)
views.py
class AddPerson(CreateView):
template_name = 'app_1/addperson.html'
person_form = PersonForm()
phone_form = PhoneForm()
def get(self, request, *args, **kwargs):
context = {'person': self.person_form, 'phone': self.phone_form}
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
person_form = PersonForm(request.POST)
phone_form = PhoneForm(request.POST)
if (person_form.is_valid() and phone_form.is_valid()):
per_f = person_form.save()
ph_f = phone_form.save(commit=False)
ph_f.person_id = per_f.id
ph_f.save()
return HttpResponseRedirect('/app_1/add-person/')
else:
return HttpResponseRedirect('/app_1/add-person/')
А вот как можно сделать создание персоны и сразу добавление номера телефона используя InlineFormSet_factory ?