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-запроса, когда пользователь обновляет браузер. браузер.


<
Вернуться на верх