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インスタンスを追加しようとしています。ResumeForeignKeyCandidate

しかし、私は常に検証エラーを受け取ります{'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)
        ....

より詳細なリファレンス:モデルと request.user

于 2012-11-08T09:48:03.497 に答える
2

コメントするのに十分なカルマがありませんが、これが私の問題でうまくいったことに注意したいだけで、私の唯一のバリエーション (ローハンの答え) は、フォームを作成する必要がないことでした。

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 に答える