Прежде всего, вы здесь установили два отношения между Employee
и Contract
. Django автоматически устанавливает отношение в обратном порядке, поэтому вы, вероятно, должны удалить его. В противном случае возможно, что some_contract.emplyee.contract
- это не то же самое, что some_contract
.
. Таким образом, вы, например, можете изменить его на:
class Employee(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
class Contract(models.Model):
employee = models.OneToOneField(Employee, on_delete=models.CASCADE<b>, related_name='contract'</b>)
contract_type = models.ForeignKey(ContractType, on_delete=models.CASCADE)
start_date = models.DateField()
end_date = models.DateField()
Вы можете просто создать дваModelForm
s:
# app/forms.py
from app.models import Employee, Contract
class EmployeeForm(ModelForm):
class Meta:
model = Employee
exclude = ['contract']
class ContractForm(ModelForm):
class Meta:
model = Contract
Затем мы можем отобразить две формы:
# app/views.py
from django.shortcuts import redirect, render
from app.forms import EmployeeForm, ContractForm
def some_view(request):
if request.method == 'POST':
employee_form = <b>EmployeeForm(request.POST)</b>
contract_form = <b>ContractForm(request.POST)</b>
if employee_form.is_valid() and contract_form.is_valid():
employee = employee_form.save()
contract_form.instance.employee = employee
contract_form.save()
return redirect(<i>'some-view'</i>)
else:
employee_form = EmployeeForm()
contract_form = ContractForm()
return render(
request,
'some_template.html',
{'employee_form': employee_form, 'contract_form': contract_form}
)
в шаблоне, затем мы отобразим две формы в одном теге <form>
:
<!-- some_template.html -->
<form method="post">
{% csrf_token %}
{{ <b>employee_form</b> }}
{{ <b>contract_form</b> }}
<button type="submit">submit</button>
</form>