2016-03-22 113 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方法本質上就像一個類的屬性。使用這樣的裝飾器版本只會讓它變成一個吸氣器。您也可以使用property作爲一種方法,如果您還想製作setter的話。

+0

你的回答很完美,非常感謝你! –

0

問題是get_context_data()未被調用,因爲它應該由您的post()方法調用。

這應該工作:

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

然而,get_context_data()應該返回數據的字典傳遞到模板,它不應該改變對象的狀態。