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/pk
URL 应该是 URL 的一部分,因此您需要将 urlpatterns
更新为:
path('add_child/<strong><int:pk></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'] # ← 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的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:缺少 1 个必需的位置参数:'self'
类型错误:parse() 缺少 1 个必需的位置参数:'stream'
TypeError:AuthMiddlewareStack() 缺少 1 个必需的位置参数:'inner'