Как установить ForeignKey в CreateView?
У меня есть модель:
class Article(models.Model):
text = models.CharField()
author = models.ForeignKey(User)
Как написать представление на основе класса, которое создает экземпляр новой модели и устанавливает внешний ключ author
для request.user
?
Ответы
Ответ 1
Я решил это, переопределив метод form_valid
. Вот подробный стиль, чтобы прояснить ситуацию:
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)
Но мы можем сделать это коротко (спасибо dowjones123), этот случай указан в документах.:
class CreateArticle(CreateView):
model = Article
def form_valid(self, form):
form.instance.author = self.request.user
return super(CreateArticle, self).form_valid(form)
Ответ 2
Код Berislav в views.py не работает для меня. Форма отображается как ожидалось, с пользовательским значением в скрытом вводе, но форма не сохраняется (я не знаю почему). Я попробовал несколько иной подход, который работает для меня:
views.py
from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article
class NewArticleView(CreateView):
model = Article
form_class = ArticleForm
def get_initial(self):
return {
"user": self.request.user
}
Ответ 3
Я просто наткнулся на эту проблему, и эта нить привела меня в правильном направлении (спасибо!). Основываясь на этой странице документации Django, мы можем вообще не обращаться к методу формы save()
:
class CreateArticle(LoginRequiredMixin, CreateView):
model = Article
def form_valid(self, form):
form.instance.author = self.request.user
return super(CreateArticle, self).form_valid(form)
Ответ 4
Вы должны настроить CreateView
с помощью ModelForm
для этой модели. В определении формы вы установите для ForeignKey
виджет HiddenInput
, а затем используйте метод get_form
в представлении, чтобы установить значение вашего пользователя:
forms.py:
from django import forms
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
widgets = {"user": forms.HiddenInput()}
views.py:
from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article
class NewArticleView(CreateView):
model = Article
form_class = ArticleForm
def get_form(self, form_class):
initials = {
"user": self.request.user
}
form = form_class(initial=initials)
return form