Django CreateView:将ForeignKey附加到CustomForm数据

时间:2012-11-08 09:24:10

标签: python django foreign-keys form-data create-view

我有一个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'}

  • 我使用的是自定义表单,而不是模型表单,因为它使用了twitter bootstrap标识符。

我错过了什么?

3 个答案:

答案 0 :(得分:11)

您必须将modelFormcandidate定义为排除字段,然后在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而不是手工编写表单。