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-форм вместо написания ваших форм вручную.