以下是我的模型
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。 然后将它们处理到视图中。
可行,还是我必须手动完成?
可以扩展上面的模型表单,以便我可以先填写用户详细信息,然后为他分配一个类型吗?
请让我知道,谢谢。
答案 0 :(得分:4)
使用两个单独的表单 - UserForm
,由models.User
& AddStaffForm
但排除了AddStaffForm中的“用户”字段。两个都只使用一个提交按钮。
因此,您的模板将如下所示:
<form method="post" action="/path/to/wherever">
{{ user_form }}
{{ add_staff_form }}
<button>Submit</button>
</form>
然后,当用户提交表单时,按以下顺序独立处理每个表单:
首先处理用户表单,并将表单创建的user
实例保存到db。如果user_form.is_valid()
为True
,您只需执行user = user_form.save()
接下来,处理AddStaffForm
但传递commit=False
(即staff = add_staff_form.save(commit=False)
,因为它还不包含user
字段的值。提供用户使用staff.user = user
然后staff.save()
如果提供了工作人员表单中的所有其他字段(即add_staff_form.is_valid()
否则为True
,这将导致创建写入db的新staff
实例。
希望这会有所帮助。 :)