2016-03-22 3 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, если хотите сделать сеттер.

+0

Вы отвечаете, прекрасно, большое вам спасибо! –

0

Вопрос заключается в том, что get_context_data() не вызывается, поскольку его следует называть вашим методом post().

Это должно работать:

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

Однако get_context_data() должна возвращать словарь данных для передачи в шаблон, не допускается изменять состояние объекта.

Смежные вопросы