首页 > 解决方案 > 如何通过父 ID 向子表单添加值?

问题描述

这是我的模型

class User(models.Model):
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)


class Phone(models.Model):
    user = models.ForeignKey(Osoba, editable=False, related_name='phone', on_delete=models.CASCADE)
    phone = models.CharField(max_length=50)

我想将电话添加到由 ID 选择的当前用户并在现场显示

我试过了

def create_phone(request, id):

    user = User.objects.get(id=id)
    form = PhoneForm(request.POST or None, instance=user)

    if form.is_valid():

        form.save()
        return redirect('list_users')

    return render(request, 'index-phone.html', {'form': form})

但它不起作用,当我单击按钮时,它不会创建新电话

我的网址

urlpatterns = [
    path('', list_users, name='list_users'),
    path('new', create_user, name='create_user'),
    path('/<int:id>/update', update_user, name='update_user'),
    path('/<int:id>/delete', delete_user, name='delete_user'),
    path('/<int:id>/', create_phone, name='create_phone')

]

标签: pythondjango

解决方案


我不确定您的 PhoneForm 类的内容,但我猜这是创建和编辑 Phone 对象的表单。实例化新的 PhoneForm 时,实例参数应该是现有的 Phone 实例,或者是 None。

您应该以另一种方式设置 Phone 实例的用户,或者通过将其设置为 PhoneForm 上的字段,或者通过手动设置用户。

这是正确的:

def create_phone(request, id):

    user = User.objects.get(id=id)
    form = PhoneForm(request.POST or None)

    if form.is_valid():

    # Setting commit to False does not save the object to the database yet.
    # We do this because we still want to edit the object.
    phone = form.save(commit=False)
    phone.user = user
    phone.save()
    return redirect('list_users')

return render(request, 'index-phone.html', {'form': form})

推荐阅读