Временные поля Django только при создании - PullRequest
3 голосов
/ 20 октября 2019

Рассмотрим две модели:

Контракт

class Contract(models.Model):
    employee = models.OneToOneField(Employee, on_delete=models.CASCADE)
    contract_type = models.ForeignKey(ContractType, on_delete=models.CASCADE)
    start_date = models.DateField()
    end_date = models.DateField()

и

Сотрудник

class Employee(models.Model):

    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    contract = models.OneToOneField(Contract, on_delete=models.CASCADE, null=True, blank=True)

Мне было интересно, есть ли способ добавить временные поля в форму модели, которые отображаются только при создании в модели Employee, чтобы я мог добавить все эти поля, пока я создаю нового сотрудника, а затем при сохранении я сначала создаюЗатем объект Employee автоматически генерирует объект Contract и редактирует исходный объект Employee и связывает теперь созданный объект Contract.

Я действительно надеюсь, что это имеет смысл, и если это так, может ли кто-нибудь направить меня в правильном направлении?

Спасибо, что уделили мне время.

1 Ответ

2 голосов
/ 20 октября 2019

Прежде всего, вы здесь установили два отношения между 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...