django将字段添加到模型表单中

时间:2013-06-26 15:33:52

标签: django django-forms

以下是我的模型

class OrgStaff(BaseModel):
    user = models.OneToOneField(User)
    member_type = models.BooleanField(help_text="1. Read/Write 0. Read Only")
    task = models.ForeignKey(ToDos, null=True, blank=True)
    org = models.ForeignKey(Org)
    # TODO Add possible activities

    def __unicode__(self):
        return self.user.username

以下是表单文件

class AddStaffForm(ModelForm):

    class Meta:
        model = OrgStaff
        exclude = (
            'task',
            'org'
            )

这就是我处理视图的方式

if request.POST and form.is_valid():
    form.save()
    ret_url = reverse("some_view", kwargs={
            'var':var,})
    return redirect(ret_url)
return render(request, "form.html", {"form":form})

此表单将呈现一个下拉列表,该下拉列表将显示数据库中的所有用户以及一个单选框。

但实际上,我想创建表单,以便我可以添加新用户(名字,姓氏,用户名,电子邮件和密码),然后添加来自abvoe AddStaffForm的其他字段。

所以问题基本上归结为将用户形式的字段添加到addstaffform。 然后将它们处理到视图中。

可行,还是我必须手动完成?

可以扩展上面的模型表单,以便我可以先填写用户详细信息,然后为他分配一个类型吗?

请让我知道,谢谢。

1 个答案:

答案 0 :(得分:4)

使用两个单独的表单 - UserForm,由models.User& AddStaffForm但排除了AddStaffForm中的“用户”字段。两个都只使用一个提交按钮。

因此,您的模板将如下所示:

<form method="post" action="/path/to/wherever">
    {{ user_form }}
    {{ add_staff_form }}
    <button>Submit</button>
</form>

然后,当用户提交表单时,按以下顺序独立处理每个表单:

  1. 首先处理用户表单,并将表单创建的user实例保存到db。如果user_form.is_valid()True,您只需执行user = user_form.save()

  2. 即可
  3. 接下来,处理AddStaffForm但传递commit=False(即staff = add_staff_form.save(commit=False),因为它还不包含user字段的值。提供用户使用staff.user = user然后staff.save()

  4. 的值

    如果提供了工作人员表单中的所有其他字段(即add_staff_form.is_valid()否则为True,这将导致创建写入db的新staff实例。

    希望这会有所帮助。 :)