3

我有一个 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 引导标识符。

我错过了什么?

4

3 回答 3

12

您必须将modelFormwith定义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

于 2012-11-08T09:48:03.497 回答
2

我没有足够的业力来发表评论,但我只想指出这对我的问题有效,我唯一的变化(关于 Rohan 的回答)是我不需要创建表单。

class ChoiceCreateView(generic.CreateView): model = Choice template_name = 'polls/choice.html' fields = ['choice_text']

相反,我指定了我想在视图中显示的字段,而不是在表单中排除它们。:)

于 2015-03-18T03:34:52.043 回答
1

我以前遇到过这个确切的问题。为了快速解决,请使用隐藏输入在表单中包含候选人,如下所示:

<input type="hidden" name="candidate" id="id_candidate" value="{{ request.user.id }}">

不过,在未来,请考虑使用django-crispy-forms而不是手动编写表单。

于 2012-11-08T14:05:49.513 回答