Вы можете использовать ModelForm
для note
(поскольку будет только 1 примечание) и InlineFormSet
для item
(так как вы разрешите несколько). Вам не нужно сохранять note
до items
- вы можете сохранить их по тому же запросу.
Динамическое добавление / удаление items
требует javascript и не будет рассмотрено в этом ответе, однако должно быть достаточно легко понять, что django ожидает получить.
Итак, прежде всего вам нужно создать ModelForm
:
forms.py:
class NoteForm(forms.ModelForm):
class Meta:
model = Goodsreceivednote
fields = '__all__'
Мы собираемся использовать inlineformset_factory
для создания InlineFormSet
для items
. При сохранении элементов, мы должны предоставить родительское примечание для иностранного поля.
views.py:
from django.forms import inlineformset_factory
from .models import Goodsreceivednote, Goodsreceiveitem
from .forms import NoteForm
def note_view(request):
# Create formset based on our parent model and child model. We are going to allow up to 3 items in form.
NoteFormSet = inlineformset_factory(Goodsreceivednote, Goodsreceiveitem, fields='__all__', extra=3)
# generate form and formset
form = NoteForm(request.POST or None, request.FILES or None)
formset = NoteFormSet(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
note = form.save()
for form in formset.forms:
item = form.save(commit=False)
item.rec_note_id = note
item.save()
return render(request, 'formset.html', {'form': form, 'formset': formset})
formset.html:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
{{ formset.as_p }}
<button type="submit">submit</button>
</form>
Также у вас нет для указания первичных ключей в моделях - они будут автоматически сгенерированы как AutoField
. Это уменьшит некоторые грубые части моделей, так как вам не нужно беспокоиться об их уникальности.