AddChild() отсутствует 1 требуемый позиционный аргумент: 'pk
У меня есть две модели, а именно Parent и Child. Мне удалось сделать модель формы для регистрации Родителя. Теперь я хочу иметь возможность добавить ребенка к родителю.
Ожидаемый результат: У каждого родителя должна быть ссылка, которая вызовет форму регистрации ребенка. Поле Parent Name должно иметь начальное значение родителя.
В настоящее время я получаю эту ошибку,
addChild() missing 1 required positional argument: 'pk
models.py
class Parent(models.Model):
surname = models.CharField(max_length=150, null=False, blank=False)
first_name = models.CharField(max_length=150, null=False, blank=False)
class Child(models.Model):
parent = models.ForeignKey(Parent, null=True, blank=True, on_delete=SET_NULL)
first_name = models.CharField(max_length=50, null=False, blank=False)
last_name = models.CharField(max_length=50, null=False, blank=False)
views.py (Чего мне не хватает в представлении addChild?)
def addParent(request):
form = ParentForm()
if request.method == 'POST':
form = ParentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
def addChild(request, pk):
parent = Parent.objects.get(id=pk)
form = ChildForm(initial={'parent' :parent})
if request.method == 'POST':
form = ChildForm(request.POST)
if form.is_valid():
form.save()
URL pk
должен быть частью URL, поэтому вам нужно обновить urlpatterns
до:
path('add_child/<int:pk>/', views.addChild, name='add_child'),
Если вы таким образом посетите URL, вы должны посетить add_child/123/
с 123
первичным ключом родителя, для которого вы хотите добавить ребенка.
Поскольку первичный ключ родителя находится в URL, нет особого смысла держать его в форме. Вы можете переписать ChildForm
на:
from django import forms
class ChildForm(forms.ModelForm):
class Meta:
model = Child
fields = ['first_name', 'last_name'] # ← no parent
и пусть представление устанавливает родителя при отправке формы:
from django.shortcuts import redirect
def addChild(request, pk):
if request.method == 'POST':
form = ChildForm(request.POST)
if form.is_valid():
form.instance.parent_id = pk
form.save()
return redirect('name-of-some-view')
else:
form = ChildForm(initial={'parent' :parent})
# …
Примечание: В случае успешного POST запроса, вы должны сделать
redirect
. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.
<