55

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

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

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

アップデート:

ソリューションは、以下の別の回答に移動しました。

4

4 に答える 4

45

メソッドをオーバーライドすることでこれを解決しました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)
于 2012-05-12T17:03:27.850 に答える
15

私はちょうどこの問題に遭遇しました、そしてこのスレッドは私を正しい方向に導きました(ありがとう!)。この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)
于 2016-06-18T22:06:45.340 に答える
2

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
        }
于 2012-05-11T11:50:58.797 に答える
1

そのモデルにCreateViewを使用して設定する必要があります。ModelFormフォーム定義で、ウィジェットForeignKeyを持つように設定してから、ビューのメソッドを使用してユーザーの値を設定します。HiddenInputget_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
于 2012-05-01T04:32:47.010 に答える