Django CreateView: добавление ForeignKey к данным CustomForm

У меня есть 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.

что мне не хватает?

3 ответа

Решение

Вы должны будете определить 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)
        ....

Более подробная ссылка на: Модели и request.user

У меня недостаточно кармы, чтобы комментировать, но я просто хотел отметить, что это сработало для моей проблемы, и мой единственный вариант (на ответ Рохана) заключался в том, что мне не нужно было создавать форму.

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

вместо этого я указываю поля, которые хочу отображать в моем представлении, а не исключаю их в форме.:)

Я столкнулся с этой проблемой раньше. Для быстрого исправления включите кандидата в форму, используя скрытый ввод, например так:

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

В будущем, тем не менее, рассмотрите возможность использования django-crispy-форм вместо написания ваших форм вручную.

Другие вопросы по тегам