2016-03-22 17 views
2

Bu gibi benim görünümünde bir değişken tanımlamak çalışıyorum: Ben bu iyi bir yol değildir biliyorum ve yap-sınıfları bunun için var, ama gözlerimiPython acemi

class PostMessageView(LoginRequiredMixin, generic.TemplateView): 
    url_redirect = None 

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

Sorun, burada değil . Benim sorunum saf Python (sanırım) hakkında. Ben soyundan yaparsanız, ben böyle yapabilir, çalışır:

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) 

Sonra argument of type 'NoneType' is not iterable alıyorum: Ben dinamik bir değere sahip url_redirect değiştirmek istediğinizde

class ContactDetailView(PostMessageView): 
    template_name = 'my_home/contact_detail.html' 
    url_redirect = 'my_profile_contact_detail' 

Sorunum sanki, Çünkü, sanırım, self.url_redirect, url_redirect'un üzerine yazmıyor.

Python'da nasıl düzgün yapılır?

cevap

1

Bunun için bir property kullanabilirsiniz:

class ContactDetailView(PostMessageView): 
    template_name = 'my_home/contact_detail.html' 

    @property 
    def url_redirect(self): 
     return self.request.build_absolute_uri(self.request.path) 

Bu url_redirect yöntem esas sınıfının bir öznitelik gibi davranır. Bunun gibi dekoratör versiyonunu kullanmak sadece bir alıcıya dönüşür. Bir ayarlayıcı yapmak isterseniz, property'u bir yöntem olarak kullanabilirsiniz.

+0

Cevabınız mükemmel, çok teşekkür ederim! –

0

Sorun, post() yönteminiz tarafından çağrılması gerektiği için get_context_data() çağrılmadığıdır.

Bu çalışması gerekir:

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

Ancak get_context_data() şablona geçmek verilerin bir sözlük dönmek gerekiyordu, nesne halini değiştiren gerekiyordu değildir.

İlgili konular