3

私には、作者がいるモデルがありますForeignKey

class Appointment(models.Model):
    # ...
    author = models.ForeignKey(User)

author現在ログインしているユーザーへの予定を作成するときに、フィールドを自動的に設定したい。つまり、作成者フィールドはフォームクラスに表示されないはずです。

class AppointmentCreateForm(ModelForm):
    class Meta:
        model = Appointment
        exclude = ('author')

2つの問題があります:

  1. 一般的なCreateViewでフォームにアクセスし、author?を設定する方法
  2. ユーザー入力から読み取った値とともに除外フィールドを保存するようにフォームに指示するにはどうすればよいですか?
4

2 に答える 2

7

以下は少し単純に見えます。self.request が設定されていることに注意してくださいView.as_view

class AppointmentCreateView(CreateView):        
    model=Appointment
    form_class = AppointmentCreateForm

    def get_form(self, form_class):
        form = super(AppointmentCreateView, self).get_form(form_class)
        # the actual modification of the form
        form.instance.author = self.request.user
        return form
于 2014-07-29T15:31:56.277 に答える
2

汎用ビューサブクラスを次のように変更しました。

class AppointmentCreateView(CreateView):        
    model=Appointment
    form_class = AppointmentCreateForm

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        # the actual modification of the form
        form.instance.author = request.user

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

ここにはいくつかの重要な部分があります。

  • 保存される実際のモデルを保持するフォームinstanceフィールドを変更しました。
  • もちろん、あなたは取り除くことができますform_class
  • 変更する必要があったpostメソッドは、階層の上の2つのクラスだったので、ベースコードself.object = None行を組み込み、オーバーロードとベースを1つの関数にマージする必要がありました(呼び出していませんsuperpost

これはかなり一般的な問題を解決するための良い方法だと思います。また、独自のカスタムビューを作成する必要はありません。

于 2012-12-01T12:35:58.753 に答える