How to set ForeignKey in CreateView?
I solved this by overriding form_valid
method. Here is verbose style to clarify things:
class CreateArticle(CreateView): model = Article def form_valid(self, form): article = form.save(commit=False) article.author = self.request.user #article.save() # This is redundant, see comments. return super(CreateArticle, self).form_valid(form)
Yet we can make it short (thanks dowjones123), this case is mentioned in docs.:
class CreateArticle(CreateView): model = Article def form_valid(self, form): form.instance.author = self.request.user return super(CreateArticle, self).form_valid(form)
I just stumbled into this problem and this thread led me in the right direction (thank you!). Based on this Django documentation page, we can avoid calling the form's save()
method at all:
class CreateArticle(LoginRequiredMixin, CreateView): model = Article def form_valid(self, form): form.instance.author = self.request.user return super(CreateArticle, self).form_valid(form)
Berislav's code in views.py doesn't work for me. The form is rendered as expected, with the user value in a hidden input, but the form is not saved (I don't know why). I have tried a slightly different approach, that works for me:
views.py
from django.views.generic import *from myapp.forms import ArticleFormfrom myapp.models import Articleclass NewArticleView(CreateView): model = Article form_class = ArticleForm def get_initial(self): return { "user": self.request.user }