2012-06-26 11 views
12

Estoy usando django-cms con apphooks para mostrar la información detallada del libro. Necesito la página con el gancho de la aplicación para aceptar una babosa que especifica qué libro mostrar.django-cms: las URL utilizadas por los apphooks no funcionan con reverse() o {% url%}

Creé una página llamada 'libros' y agregué el apphook 'BookDetailApp'.

Esto es lo que se ve mi archivo books.cms_app como:

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

apphook_pool.register(BooksApp) 

Esto es lo que se ve como mis books.urls:

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

Y esto es lo que mi archivo books.views parece:

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

Todo esto funciona bien cuando voy directamente a la página de detalles del libro. Así que yendo a http://localhost:8000/books/the-book-slug/ funciona exactamente como yo quiero.

El problema es que necesito poder enlazar con páginas de detalles de libros específicos de las promociones en la página de inicio y ninguno de los métodos esperados me funciona.

Utilizando la etiqueta de plantilla de Django PAGE_URL-CMS no funciona, ya que sólo acepta un argumento, así que no puedo proporcionar la babosa necesaria para determinar qué libro pantalla:

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

Como era de esperar este solo redirige a http://localhost:8000/books/, lo que arroja un error porque no se incluyó la babosa requerida.

Así que mis próximas opciones son usar la etiqueta de la plantilla de la url o definir una función get_absolute_url() en el modelo. Ninguna de estas opciones de trabajo:

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

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

Estos dos producirá un error de NoReverseMatch: Reverse for 'book_detail' not found.

Si incluyo el archivo books.urls conf en mi configuración de la URL principal, entonces funciona. Por lo tanto, parece que si la url solo está siendo utilizada por un apéndice de cms, no puede ser revertida por django.

Incluir books.urls en mis URL principales parece ser una solución sucia y definitivamente no quiero codificar las URL en la plantilla o la función get_absolute_url. Ninguna de esas soluciones parece muy 'pythonesque'.

¿Alguna sugerencia?

EDIT:

inversa sólo funciona si uso el espacio de nombres del lenguaje. De acuerdo con la documentación, especificar el idioma del espacio de nombres no debería ser requerido.

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

Tengo el mismo problema hace algún tiempo. Creo que esto es un error en django-cms. Por lo que recuerdo, implementé mi propia etiqueta de plantilla inversa que solucionó este problema, porque no tuve tiempo suficiente para corregir este error en el origen y crear una solicitud de extracción. Eso sería genial para informar y corregirlo. –

Respuesta

8

Esto se debió aparentemente a nuestra solicitud de tener cms.middleware.multilingual.MultilingualURLMiddleware que luego obligó a todos {% url %} etiquetas de plantilla y la función reverse() para requerir el espacio de nombres del lenguaje.

Como nuestro sitio no está localizado, eliminar el middleware funcionó bien. La documentación no me pareció clara en esto y finalmente encontré la respuesta de otra fuente.

+0

¿Hay alguna prueba para esto? Esa clase parece haber sido eliminada del cms middleware pero todavía no puedo obtener '{% url 'gallery_images' gallery_id = gallery.id%}' para revertir mi patrón de url 'url (r '^ (? P \ d +)/$ ',' detail ', name = "gallery_images"), ' –

+2

Parece estar arreglado desde la versión 2.4, por favor lea la documentación antes de actualizar, necesita [siga algunos pasos] (http: // docs. django-cms.org/en/3.0.1/upgrade/2.4.html) al actualizar. –

Cuestiones relacionadas