我有一个CreateView,如下所示:
class ResumeCreateView(CreateView):
model = Resume
def form_valid(self, request, form):
candidate = Candidate.objects.get(user=self.request.user)
self.object = form.save(commit=False)
self.object.candidate = candidate
self.object.save()
f = self.request.FILES.get('file')
data = [{
'title': self.request['title'],
'name': f.name,
}]
response = JSONResponse(data, {}, response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return response
在这里,我尝试将candidate
个实例附加到Resume
模型候选字段,该字段是ForeignKey
模型的Candidate
。
但我总是收到验证错误{'candidate' : 'This field is required'}
我错过了什么?
答案 0 :(得分:11)
您必须将modelForm
与candidate
定义为排除字段,然后在form_valid()
方法中进行设置。
class ResumeForm(forms.ModelForm):
class Meta:
model = Resume
exclude = ('candidate',)
class ResumeCreateView(CreateView):
form_class = ResumeForm
model = Resume
def form_valid(self, form):
form.instance.candidate = Candidate.objects.get(user=self.request.user)
....
更详细的参考资料:Models and request.user
答案 1 :(得分:2)
我没有足够的业力来发表评论,但我只想注意这对我的问题很有帮助。我唯一的变化(关于Rohan的答案)是我不需要创建表单。
class ChoiceCreateView(generic.CreateView):
model = Choice
template_name = 'polls/choice.html'
fields = ['choice_text']
相反,我指定我想要在我的视图中显示的字段,而不是在表单中排除它们。 :)
答案 2 :(得分:1)
我之前遇到过这个问题。要快速修复,请使用隐藏输入在表单中包含候选项,如下所示:
<input type="hidden" name="candidate" id="id_candidate" value="{{ request.user.id }}">
但是,将来考虑使用django-crispy-forms而不是手工编写表单。