Django中的外键 - 第二种形式

时间:2015-07-01 15:47:45

标签: python django forms foreign-keys modelform

我有第二张表格,必须在第一张表格之后提交。 但是我无法保存两个模型之间的关系,除非我为提交表单的人提供选项,选择第一个表单的电子邮件。我的想法是直接在后端提供此信息,但我不能这样做。

我的模型太大了,无法在这里发布,所以如果有任何可以帮助我提出一个通用的想法,我会很高兴。

我在Django中使用两种形式的ModelForm。

我的模特:                                            用户                                          人                     志愿者 - 客户 - 员工

我有3种类型的志愿者:管理员;程序;委员会; 填写志愿者 - 用户 - 用户模型后,我需要转到志愿者管理员或志愿者计划或志愿者委员会的下一个表格;

因为用户也使用电子邮件作为主键,这是我从管理程序创建外键时的值,而modelform给我选择电子邮件。但是在数据库中,只保留引用的id。

我第一次看到处理第一种形式:

def volunteer_form(request):

if request.method == 'POST':
    form = VolunteerForm(request.POST)
    if form.is_valid():
        saving = form.save(commit=False)
        saving.password = make_password(form.cleaned_data['password'])
        saving.save()
        item = saving.id
        if saving.person_volunteer_type == 'Program':
            return HttpResponse('<script language="JavaScript"> location.href="http://127.0.0.1:8000/login/volunteer_program?id=' + str(item) + '" </script>')

        elif saving.person_volunteer_type == 'Admin"]':
            return HttpResponse('<script language="JavaScript"> alert("You have sucessful created a new Volunteer"); location.href="http://127.0.0.1:8000/login/clock_in/" </script>')

        elif saving.person_volunteer_type == 'Committee':
            return HttpResponse('<script language="JavaScript"> alert("You have sucessful created a new Volunteer"); location.href="http://127.0.0.1:8000/login/clock_in/" </script>')

else:
    form = VolunteerForm()

return render(request, 'loginPortal/volunteer_form.html', {'form' : form})

处理第二种形式:

def volunteer_program(request):
if request.method == 'POST':
    form = VolunteerProgramForm(request.POST)
    if form.is_valid():
        saving = form.save(commit=False)
        saving.pvolunteer_personid_id = form.cleaned_data.get('id_pvolunteer_personid_id')
        saving.save()
        return HttpResponse('<script language="JavaScript"> alert("You have sucessful created a new Volunteer"); location.href="http://127.0.0.1:8000/login/clock_in/" </script>')

elif request.method =='GET':
    item = request.GET['id']
    form = VolunteerProgramForm()

    return render(request, 'loginPortal/volunteer_program.html', {'form' : form , 'item' : item })

else:
    form = VolunteerProgramForm()

return render(request, 'loginPortal/volunteer_program.html', {'form' : form })

1 个答案:

答案 0 :(得分:0)

通用答案,假设你的第二个模型对第一个模型有一个ForeignKey。在您查看的帖子中执行此操作:

1)验证第一个表单,如果它不能验证,则返回错误。

2)验证第二个表格,如果它没有验证,则返回错误。

3)如果两者都验证,则从第一个表单中保存实例:

first_instance = first_form.save()

4)保存第二种形式的实例,而不将更改提交到数据库:

second_instance = second_form.save(commit=False)

5)更新第二个模型实例上的外键:

second_instance.fk_to_first_model = first_instance

6)将第二个实例保存到数据库

second_instance.save()

7)回归成功!