@sazhyk

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

Есть две модели
models.py
from django.db import models

class Person(models.Model):
    name = models.CharField()

class Phone(models.Model):
    person = models.ForeignKey(Person)
    number = models.CharField()

От них две формы
forms.py
from django import forms
from myapp.models import Person, Phone

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ('name')

class PhoneForm(forms.ModelForm):
    class Meta:
        model = Phone
        fields = ('number')

Вьюшка
views.py
from django.shortcuts import render, HttpResponseRedirect
from myapp.forms import PersomForm, PhomeForm

def new_person(request):
    if request.method == "POST":
        person_form = PersonForm(request.POST or None)
        phone_form = PhoneForm(request.POST or None)
        if person_form.is_valid() and phone_form.is_valid():
            person_f = person_form.save(commit=False)
            person_f.author = request.user
            phone_f = phone_form.save(commit=False)
            ???
            phone_form.save()
            person_form.save()
            person_form.save_m2m()
            return HttpResponseRedirect('/person/new/')
    else:
        person_form = PersonForm()
        phone_form = PhoneForm()
    context = {
        'person_form': person_form,
        'phone_form': phone_form,
    }
    return render(request, 'form.html', context)

И шаблон
form.html
<form method="post" action="" class="form-horizontal">
    {% csrf_token %}
    {{ person_form  }}
    {{ phone_form  }}
    <input type="submit" value="Создать" />
</form>


На что получаю ошибку
The above exception (ОШИБКА: нулевое значение в столбце "person_id" нарушает ограничение NOT NULL DETAIL: Ошибочная строка содержит (1, +7(900)123-45-67, null). ) was the direct cause of the following exception:


Собственно вопрос. Я понимаю в чем ошибка, я не могу получить person_id. Потому у меня во вьюшке и стоят вопросительные знаки там, где должно быть получение его самого. Если не делать phone_f = phone_form.save(commit=False), а сразу сохранять - всё равно такая же ошибка.
ЧЯДНТ?
  • Вопрос задан
  • 4761 просмотр
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы