1

以下是我拥有的模型

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。然后将它们处理成视图。

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

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

请让我知道,谢谢。

4

1 回答 1

4

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

所以你的模板看起来像:

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

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

  1. 先处理用户表单,将user表单创建的实例保存到数据库中。如果user_form.is_valid()True,你可以通过简单地做到这一点user = user_form.save()

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

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

希望这可以帮助。:)

于 2013-06-26T18:29:38.947 回答