2016-03-22 19 views
2

私はこのような私の見解で変数を定義しようとしている:私はこれは良い方法ではありません知っている、とビルドインクラスはそのためにありますが、私をPythonの初心者

class PostMessageView(LoginRequiredMixin, generic.TemplateView): 
    url_redirect = None 

    def post(self, request, *args, **kwargs): 
     return redirect(self.url_redirect) 

問題はではなく、です。私の問題は純粋なPythonについてです(私は推測します)。私は子孫を作る場合、私はそのようにそれを行うことができ、それが動作します:

class ContactDetailView(PostMessageView): 
    template_name = 'my_home/contact_detail.html' 
    url_redirect = 'my_profile_contact_detail' 

私の問題は、私は同じように、動的な値でurl_redirectを変更したいときです:

class ContactDetailView(PostMessageView): 
    template_name = 'my_home/contact_detail.html' 

    def get_context_data(self, **kwargs): 
     self.url_redirect = self.request.build_absolute_uri(self.request.path) 

その後、私はargument of type 'NoneType' is not iterableを取得しますself.url_redirectは、url_redirectを上書きしないためです。

Pythonで正しく行うにはどうすればいいですか?

答えて

1

あなたはこのためにpropertyを使用することができます。

class ContactDetailView(PostMessageView): 
    template_name = 'my_home/contact_detail.html' 

    @property 
    def url_redirect(self): 
     return self.request.build_absolute_uri(self.request.path) 

このurl_redirect方法は、基本的にクラスの属性のように動作します。このようなデコレータバージョンを使用すると、getterだけになります。あなたはセッターを作成したい場合は、代わりにpropertyをメソッドとして使用できます。

+0

あなたは答えが完璧です、本当にありがとう! –

0

あなたのpost()メソッドで呼び出す必要があるため、get_context_data()が呼び出されないという問題があります。

これは動作するはずです:

def post(self, request, *args, **kwargs): 
    self.get_context_data() 
    return redirect(self.url_redirect) 

しかし、get_context_data()をテンプレートに渡すデータの辞書を返すことになっている、オブジェクトの状態を変更する想定されていません。