Python初学者与类变量

时间:2016-03-22 17:12:13

标签: python django

我正试图在我的视图中定义一个变量,如下所示:

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中正确完成?

2 个答案:

答案 0 :(得分: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作为一种方法。

答案 1 :(得分:0)

问题在于get_context_data()未被调用,因为它应该由您的post()方法调用。

这应该有效:

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

但是,get_context_data()应该返回要传递给模板的数据字典,不应该改变对象状态。