Używam widoku generycznego DetailView klasy Django do wyszukiwania obiektu do wyświetlenia. W pewnych okolicznościach zamiast wyświetlać obiekt, chcę wycofać się i zamiast tego wydać polecenie redestowania HTTP. Nie widzę, jak to robię. Dzieje się tak, gdy użytkownik uderza w obiekt w mojej aplikacji, ale bez użycia kanonicznego adresu URL. Tak więc, na przykład, na URL StackOverflow przybrać formę:Przekierowanie z widoku ogólnego View DetailView w Django
http://stackoverflow.com/<content_type>/<pk>/<seo_friendly_slug>
np
http://stackoverflow.com/questions/5661806/django-debug-toolbar-with-django-cms-and-django-1-3
Rzeczywiście można wpisać cokolwiek jako część seo_friendly_slug i będzie przekierowanie do właściwej kanonicznym URL dla obiektu spojrzał w górę przez PK.
Chciałbym zrobić to samo w moim DetailView. Odzyskaj obiekt, sprawdź, czy jest to kanoniczny adres URL, a jeśli nie, przekieruj go na adres URL get_absolute_url elementu.
Nie mogę zwrócić HttpResponseRedirect w get_object, ponieważ oczekuje obiektu wyszukującego. Nie mogę go zwrócić z get_context_data, ponieważ oczekuje tylko danych kontekstowych.
Może po prostu muszę napisać widok ręczny, ale zastanawiałem się, czy ktoś wie, czy to było możliwe?
Dzięki!
Ludo.
Możesz po prostu zadzwonić do metody pobierania rodziców w innym przypadku. Byłoby znacznie czystsze. Jest to całkowicie opłacalne, ponieważ ogólne widoki oparte na klasach są rozszerzone o niestandardową funkcjonalność. – vimukthi
To, co jest dobre w twoim podejściu, to to, że nie musimy się martwić, jeśli implementacja BaseDetailView.get zmieni się, ale wadą jest to, że musimy dwukrotnie pobrać obiekt dla każdego żądania, co dla mnie nie jest warte potencjalnego uderzenia wydajności/skalowalności. – Rolo
Aby uniknąć podwójnego trafienia w 'get_object', możesz go przesłonić we własnej klasie lub mixin i przedmowie, zaznaczając' if hasattr (self, 'object', None) '; jeśli sprawdzenie się powiedzie, zwróć 'self.object' inaczej nazwij polecenie' get_object'. Dokładnie tak, jak zaimplementowano @Raumkraut (https://stackoverflow.com/a/12858110). – interDist