web-dev-qa-db-ja.com

CreateViewでForeignKeyを設定する方法は?

私はモデルを持っています:

class Article(models.Model):
    text = models.CharField()
    author = models.ForeignKey(User)

新しいモデルインスタンスを作成し、author外部キーをrequest.userに設定するクラスベースのビューを作成するにはどうすればよいですか?

更新:

ソリューションは別の answer に移動しました。

44
Vlad T.

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)

それでも短くすることができます(thanks dowjones123)。この場合は ドキュメントに記載されています です。

class CreateArticle(CreateView):
    model = Article

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(CreateArticle, self).form_valid(form)
40
Vlad T.

私はこの問題に出くわしました、そしてこのスレッドは私を正しい方向に導きました(ありがとう!) this 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)
11

Views.py内のBerislavのコードが機能しません。フォームは期待どおりにレンダリングされ、ユーザー値は非表示の入力に含まれますが、フォームは保存されません(理由はわかりません)。私はわずかに異なるアプローチを試しましたが、それは私にとってはうまくいきます:

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
        }
2
jantoniomartin

そのモデルにはCreateViewを使用してModelFormを設定する必要があります。フォーム定義では、ForeignKeyHiddenInputウィジェットを設定してから、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
1
Berislav Lopac