【问题标题】: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提问。

标签: django django-views


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多