我正试图在我的视图中定义一个变量,如下所示:
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中正确完成?
答案 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()
应该返回要传递给模板的数据字典,不应该改变对象状态。