私はモデルを持っています:
class Article(models.Model):
text = models.CharField()
author = models.ForeignKey(User)
author
新しいモデルインスタンスを作成し、外部キーをに設定するクラスベースのビューを作成するにはどうすればよいrequest.user
ですか?
アップデート:
ソリューションは、以下の別の回答に移動しました。
私はモデルを持っています:
class Article(models.Model):
text = models.CharField()
author = models.ForeignKey(User)
author
新しいモデルインスタンスを作成し、外部キーをに設定するクラスベースのビューを作成するにはどうすればよいrequest.user
ですか?
アップデート:
ソリューションは、以下の別の回答に移動しました。
メソッドをオーバーライドすることでこれを解決しました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)
私はちょうどこの問題に遭遇しました、そしてこのスレッドは私を正しい方向に導きました(ありがとう!)。この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)
views.pyのBerislavのコードは私には機能しません。フォームは期待どおりにレンダリングされ、ユーザー値が非表示になっていますが、フォームは保存されません(理由はわかりません)。私は少し異なるアプローチを試しましたが、それは私にとってはうまくいきます:
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
}
そのモデルに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