2012-06-26 27 views
12

Używam django-cms z apphooks do wyświetlania informacji o szczegółach książki. Potrzebuję strony z hakiem aplikacji, by zaakceptować wycinek, który określa, którą książkę wyświetlić.django-cms: adresy URL używane przez apphooki nie działają z odwróceniem() ani {% url%}

Stworzyłem stronę o nazwie "books" i dodano apphook "BookDetailApp".

Oto co mój plik books.cms_app wygląda następująco:

class BooksApp (CMSApp): 
    name = _('Book Detail Page Application') 
    urls = ['books.urls'] 

apphook_pool.register(BooksApp) 

Oto co moje books.urls wygląda następująco:

urlpatterns = patterns('', 
    url(r'^(?P<slug>[\w\-]+)?', BookDetailView.as_view(), name='book_detail'), 
) 

A oto co mój plik books.views wygląda następująco:

class BookDetailView (DetailView): 
    model = Book 
    template_name = 'layouts/book-detail.html' 
    context_object_name = 'book' 

Wszystko działa dobrze, gdy przejdę bezpośrednio do strony szczegółów książki. Więc idę do http://localhost:8000/books/the-book-slug/ działa dokładnie tak, jak chcę.

Problem polega na tym, że muszę mieć możliwość linkowania do konkretnych stron z informacjami o szczegółach książki z promowanych na stronie głównej i żadna z oczekiwanych metod nie działa dla mnie.

Wykorzystując szablon PAGE_URL z django-CMS nie działa, ponieważ przyjmuje tylko jeden argument, więc nie mogę podać ślimak potrzebne do określenia, które książki do wyświetlania:

<a href="{% page_url 'book_detail' %}">go</a> 

Zgodnie z oczekiwaniami ten tylko przekierowuje na numer http://localhost:8000/books/, który zgłasza błąd, ponieważ nie uwzględniono wymaganego limitu.

Moje następne opcje to użycie tagu szablonu adresu URL lub zdefiniowanie funkcji get_absolute_url() w modelu. Żadna z tych opcji nie działa:

<a href="{% url book_detail book.slug %}">go</a> 

def get_absolute_url(self): 
    return reverse('book_detail', args=[self.slug]) 

one zarówno doprowadzić do błędu NoReverseMatch: Reverse for 'book_detail' not found.

Jeśli dołączę books.urls conf do mojego głównego adresu URL, to działa. Wygląda więc na to, że jeśli adres URL jest używany tylko przez cmh, nie można go odwrócić za pomocą django.

W tym books.urls w moich głównych adresów URL wygląda na brudne rozwiązanie i na pewno nie chcę zakodować adresów URL w szablonie lub funkcji get_absolute_url. Żadne z tych rozwiązań nie wydaje się bardzo "pythonesque".

Wszelkie sugestie?

EDIT:

Odwrócona działa tylko wtedy, gdy używam nazw języka. Zgodnie z dokumentacją określanie przestrzeni nazw języków nie powinno być wymagane.

>>> reverse('en:book_detail', args=[book.slug]) 
+1

Mam ten sam problem jakiś czas temu. Myślę, że jest to błąd w django-cms. O ile pamiętam, zaimplementowałem własny tag odwrotnego szablonu, który rozwiązał ten problem, ponieważ nie miałem wystarczająco dużo czasu, aby naprawić ten błąd w źródle i utworzyć żądanie ściągnięcia. Byłoby wspaniale to zgłosić i naprawić. –

Odpowiedz

8

To był najwyraźniej z powodu naszej aplikacji posiadającej cms.middleware.multilingual.MultilingualURLMiddleware który następnie przymusowej wszystkie {% url %} tagów szablonu i funkcji reverse() wymagać przestrzeni nazw języka.

Ponieważ nasza strona nie jest zlokalizowana, usunięcie oprogramowania pośredniego działało poprawnie. Dokumentacja nie wydawała mi się tak jasna i ostatecznie znalazłem odpowiedź z innego źródła.

+0

Czy istnieje test na to? Wydaje się, że ta klasa została usunięta z oprogramowania pośredniego cms, ale nadal nie mogę uzyskać '{% url 'gallery_images' gallery_id = gallery.id%}' aby odwrócić mój wzorzec url 'url (r '^ (? P \ d +)/$ ',' detail ', name = "gallery_images"), ' –

+2

Wygląda na to, że został naprawiony od wersji 2.4, zapoznaj się z dokumentacją przed uaktualnieniem, musisz [wykonaj kilka kroków] (http: // docs. django-cms.org/en/3.0.1/upgrade/2.4.html) podczas aktualizacji. –