addChild() 缺少 1 个必需的位置参数:'pk

Posted

技术标签:

【中文标题】addChild() 缺少 1 个必需的位置参数:\'pk【英文标题】:addChild() missing 1 required positional argument: 'pkaddChild() 缺少 1 个必需的位置参数:'pk 【发布时间】:2022-01-22 00:27:43 【问题描述】:

我有两个模型,即 Parent 和 Child。我已经设法制作了一个用于注册父母的模型表格。现在我希望能够将孩子添加到父母中。

预期结果:每个家长都应该有一个链接,该链接将打开一个孩子的注册表单。父名称字段应具有父项的初始值。

我目前收到此错误,

addChild() 缺少 1 个必需的位置参数:'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()

【问题讨论】:

分享你的网址。 urlpatterns = [ path('', views.index , name="home"), path('parent//', views.display, name="parent") , path('add_parent/', views.addParent, name="add_parent"), path('add_child/', views.addChild, name="add_child"), ] 请edit提问。 【参考方案1】:

pk URL 应该是 URL 的一部分,因此您需要将 urlpatterns 更新为:

path('add_child/<strong>&lt;int:pk&gt;</strong>/', views.addChild, name='add_child'),

如果您因此访问该 URL,您应该访问 add_child/<b><i>123</i></b>/123 是您要为其添加子项的父项的主键。

由于父级的主键在 URL 中,所以将其保留在表单中没有多大意义。您可以将ChildForm 重写为:

from django import forms

class ChildForm(forms.ModelForm):
    class Meta:
        model = Child
        fields = ['first_name', 'last_name']  # &leftarrow; 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 pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。


注意:函数通常用 snake_case 写,而不是 PascalCase,因此它是 建议将您的函数重命名为 add_child,而不是 addChild

【讨论】:

以上是关于addChild() 缺少 1 个必需的位置参数:'pk的主要内容,如果未能解决你的问题,请参考以下文章

缺少 1 个必需的位置参数:'queryset'

TypeError:缺少 1 个必需的位置参数:'self'

类型错误:parse() 缺少 1 个必需的位置参数:'stream'

TypeError:AuthMiddlewareStack() 缺少 1 个必需的位置参数:'inner'

类型错误:预测()缺少 1 个必需的位置参数:'params'

类型错误:initialize() 缺少 1 个必需的位置参数:'url'