Ekran için bir nesneyi aramak için Django sınıf tabanlı bir DetailView genel görünümü kullanıyorum. Belirli koşullar altında, nesneyi görüntülemek yerine, bunun yerine bir HTTP rediect'i dışarıda bırakmak ve yayınlamak istiyorum. Bunu yapmak için nasıl gittiğimi göremiyorum. Bir kullanıcı benim uygulamamdaki bir nesneyi vurduğunda, ancak kanonik URL'yi kullanmadan. Yani, örneğin, StackOverflow URL'ler hakkında biçiminde:Yönlendirmeden Genel Görünüm Ayrıntı GörünümüDuvar görünümü
http://stackoverflow.com/<content_type>/<pk>/<seo_friendly_slug>
örn:
Aslında seo_friendly_slug parçası olarak bir şey yazabilirsiniz ve nesne için doğru kanonik URL'ye yönlendirirhttp://stackoverflow.com/questions/5661806/django-debug-toolbar-with-django-cms-and-django-1-3
PK aracılığıyla baktım.
Bunu aynısını DetailView'umda yapmak isterim. Nesneyi geri alın, kurallı URL olduğunu ve öğenin get_absolute_url URL'sine yönlendirmediğini kontrol edin.
HttpResponseRedirect'i, bakılan nesneyi beklediği için get_object öğesinden geri dönemem. İçerik verisini beklediği için get_context_data'dan döndüremiyorum.
Belki sadece manuel bir görünüm yazmam gerekiyor, ancak bunun mümkün olup olmadığını bilen var mı?
Teşekkürler! Ludo.
Diğer durumlarda burada ebeveyn alma yöntemini çağırabilirsiniz. Daha temiz olurdu. Özel işlevsellik için genişletilecek sınıf tabanlı genel görünümler olduğundan tamamen buna değer. – vimukthi
Yaklaşımınız ile ilgili iyi olan şey, eğer BaseDetailView.get uygulaması değiştiğinde endişelenmenize gerek olmamasıdır, ancak olumsuzluk, her istek için nesne alma işlemini iki kez yapmamız gerektiğidir. potansiyel performans/ölçeklenebilirlik isabetine değer. – Rolo
'get_object' için çift vuruştan kaçınmak için, kendi sınıfınızda geçersiz kılabilir ya da bir kontrolle önsözleştirebilirsiniz' eğer hasattr (self, 'object', None) '; Çeki başarılı olursa "self.object" i döndürürseniz, aksi takdirde ebeveynin "get_object" i çağırılır. Tam olarak @Raumkraut uygulandığı gibi (https://stackoverflow.com/a/12858110). – interDist