2016-03-22 74 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()应该返回数据的字典传递到模板,它不应该改变对象的状态。