2011-08-22 27 views
11

私はDjangoで初めてのアプリケーションを書いていますが、create_object Generic Viewに問題があります。私のurls.pyでは、私が持っている:Djangoの汎用ビューを拡張する

(r'^new$', CreateView.as_view()), 

問題は、ユーザーが「新しい」フォームを送信するとき、私は(私は実際に外国user_idを追加する必要がデータベースに保存されるデータを操作する必要があるということですキー);汎用ビューなしで私が書くために使用:私のビュー(予告data.user=request.user)で

form = ClientForm(request.POST) 
    if form.is_valid(): 
     data = form.save(commit=False) 
     data.user = request.user 
     data.save() 
     form.save_m2m() 

を。私はDjangoのドキュメントを検索しましたが、これを行う方法を見つけることができません(おそらくCreateViewクラスを拡張することによって) - 本の中にはlast_accessed_dateフィールドを更新するListViewクラスのget_objectメソッドをオーバーライドする例しかありません。

+0

は、彼ら "の実行余分な作業" でありますget_objectメソッドは、クラス[link](https://docs.djangoproject.com/en/dev/topics/class-based-views/#performing-extra-work)を拡張することでオーバーライドできると説明しています。 –

答えて

20

あなたはget_form方法オーバーライドすることによってこれを行うことができます。

from django.views.generic import CreateView 

class CustomCreateView(CreateView): 
    def get_form(self, form_class): 
     form = super(CustomCreateView, self).get_form(form_class) 
     form.instance.user = self.request.user 
     return form 

EDIT:今日で私はIssac Kelly's answerに従ってform_validをオーバーライドします:ここで

from django.views.generic import CreateView 

class CustomCreateView(CreateView): 
    def form_valid(self, form): 
     form.instance.user = self.request.user 
     return super(CustomCreateView, self).form_valid(form) 
関連する問題