【问题标题】:Foreign Key in Django - second FormDjango 中的外键 - 第二种形式
【发布时间】:2015-09-18 21:21:03
【问题描述】:

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

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

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

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

比我有 3 种类型的志愿者:管理员;程序;委员会; 填写完 Volunteer-Person-User 模型后,我需要转到 Volunteer Admin 或 Volunteer Program 或 Volunteer Committee 的下一个表格;

因为用户也使用电子邮件作为主键,这就是我从管理程序创建外键时的值,并且模型表单为我提供了电子邮件的选择。但在数据库上,只保留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 })

【问题讨论】:

  • 如果您的模型太大,请发布一个较短的示例。这会让你更容易理解你想要做什么。
  • 我不确定我是否关注,您是说第一个表单需要填写 email 字段,但该字段在第二个表单上?
  • 你可以只发布具有相关字段的模型,以及处理表单的视图吗?
  • 你能用这些信息编辑你的问题吗?

标签: python django forms foreign-keys modelform


【解决方案1】:

通用答案,假设您的第二个模型具有第一个模型的 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) 返回成功!

【讨论】:

  • 感谢您的帮助。我已经保存了第一种形式,一切正常,但是,我不知道如何通过关系传递第二种形式。就像,我正在使用 modelForm 并且如果我为与第一个表单相关的字段放置正常实例,将出现一个“选项输入”来选择用户的电子邮件引用。我的意图是不给用户这个选项并自动传递这个值。
  • 第二种形式,不要在表单中包含外键字段。您可以将其他字段列入白名单或将外键列入黑名单(第一个选项更好)。这样,第二种形式根本不会处理外键的选择。这正是您使用 commit=False 保存第二个表单时所做的事情,否则它会引发 IntegrityError,然后您将第一个实例存储在准备存储的第二个模型上。
  • 首先,您的第二个表单必须知道创建了哪个用户,而无需再次询问用户。唯一的方法是将其传递给第二个视图,因此您可以在 url 中传递纯电子邮件,或者对其进行编码并在 url 中传递。然后,在第二个视图中,您可以通过查询作为参数的电子邮件来推断您需要提供给外键的用户。其他方法是将电子邮件存储在会话中,然后在第二个视图中查询会话。
  • 这正是我所尝试的,但我无法保存我检索到的数据......
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多