我在使用表单“操作”属性将表单提交到其他URL时遇到问题。 我有一个DetailView(如下所示),它显示有关特定教师的信息,例如ProfileView和DetailView呈现的HTML模板包含将由另一个URL /视图处理的表单。
class TeacherDetail(DetailView):
model = Teacher
template_name = ‘teacher_info.html’
<form method="POST" action="/inter/account/start/">{%csrf_token%}
<input type="hidden" name="teacher" id="object.id" value="{{object}}">
<button type="submit" name="invite">Invite Teacher</button>
</form>
我的意图是还将对象本身从特定的DetailView发送到将要发送到表单的url,因为表单验证需要它。
class MakeInvitation(CreateView):
model = Invitation
fields = []
def form_valid(self, form):
form.instance.inviter = self.request.user.student
form.instance.invitee = self.request.POST['teacher']
return super().form_valid(form)
模型“邀请”只有两个字段,邀请者和被邀请者。我让form.instance.inviter成为当前的学生用户,并且让form.instance.invitee(教师模型的外键)成为了教师,其个人资料页就是表单的来源,所以我尝试使用request.POST以从DetailView页面中的表单获取对象。
我得到一个(ValueError:无法分配“'test one'”:“ Invitation.invitee”必须是“ Teacher”实例。)
答案 0 :(得分:0)
这里有几个问题。
您没有使用视图或表单的任何功能。您应该将invitee
添加到字段列表中,并适当设置隐藏字段的名称。同样,该字段的值必须是教师的ID,而不是其字符串表示形式。因此模板行是:
<input type="hidden" name="invitee" value="{{ object.id }}
视图可以是:
class MakeInvitation(CreateView):
model = Invitation
fields = ['invitee']
def form_valid(self, form):
form.instance.inviter = self.request.user.student
return super().form_valid(form)