2012-06-26 15 views
12

Uso il django-cms con gli apphook per visualizzare le informazioni dettagliate sui libri. Ho bisogno che la pagina con il gancio dell'app accetti uno slug che specifica quale libro visualizzare.django-cms: gli URL utilizzati dagli apphook non funzionano con reverse() o {% url%}

Ho creato una pagina denominata "libri" e aggiunto l'app "BookDetailApp".

Ecco cosa il mio file books.cms_app assomiglia:

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

apphook_pool.register(BooksApp) 

Ecco quello che i miei books.urls assomiglia:

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

Ed ecco quello che la mia lima books.views assomiglia:

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

Questo tutto funziona correttamente quando vado direttamente alla pagina dei dettagli del libro. Quindi andare a http://localhost:8000/books/the-book-slug/ funziona esattamente come voglio.

Il problema è che ho bisogno di essere in grado di collegarmi a pagine specifiche di un libro dai promo sulla home page e nessuno dei metodi previsti funziona per me.

Utilizzando il tag modello PAGE_URL da django-cms non funziona perché accetta un solo argomento, quindi non posso fornire la lumaca necessarie per determinare quale libro da visualizzare:

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

Come previsto questo reindirizza solo a http://localhost:8000/books/ che genera un errore perché la slug richiesta non è stata inclusa.

Quindi le mie prossime opzioni sono utilizzare il tag modello di URL o definire una funzione get_absolute_url() sul modello. Nessuna di queste opzioni di lavoro:

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

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

Questi sia risultato in un errore di NoReverseMatch: Reverse for 'book_detail' not found.

Se includo il file books.urls nel mio URL principale conf, allora funziona. Quindi sembrerebbe che se l'url viene usato solo da un cms apphook che non può essere invertito da django.

L'inclusione di books.urls nel mio URL principale sembra una soluzione sporca e sicuramente non voglio codificare gli URL nel modello o la funzione get_absolute_url. Nessuna di queste soluzioni sembra molto "pythonesque".

Qualche suggerimento?

EDIT:

inversione funziona solo se uso lo spazio dei nomi della lingua. Secondo la documentazione che specifica lo spazio dei nomi della lingua non dovrebbe essere richiesto.

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

Ho lo stesso problema qualche tempo fa. Penso che questo sia un bug nel django-cms. Per quanto ricordo, ho implementato il mio reverse template tag che ha risolto questo problema, perché non avevo abbastanza tempo per correggere questo bug in source e creare una richiesta pull. Sarebbe bello segnalare e risolvere il problema. –

risposta

8

Questo era apparentemente a causa della nostra applicazione avere cms.middleware.multilingual.MultilingualURLMiddleware che poi ha costretto tutti {% url %} tag di template e la funzione reverse() di richiedere lo spazio dei nomi della lingua.

Poiché il nostro sito non è localizzato, la rimozione del middleware ha funzionato correttamente. La documentazione non mi è sembrata chiara e alla fine ho trovato la risposta da un'altra fonte.

+0

Esiste un test per questo? Quella classe sembra essere stata abbandonata dal middleware cms, ma non riesco ancora a ottenere '{% url 'gallery_images' gallery_id = gallery.id%}' per invertire il mio url pattern 'url (r '^ (? P \ d +)/$ ',' detail ', name = "gallery_images"), ' –

+2

Sembra essere risolto dalla versione 2.4, si prega di leggere la documentazione prima dell'aggiornamento, è necessario [seguire alcuni passaggi] (http: // docs. django-cms.org/en/3.0.1/upgrade/2.4.html) durante l'aggiornamento. –

Problemi correlati