2009-04-03 23 views
8

Aquí está la pregunta ¿cómo uso el reverso para la vista genérica object_detail?¿Cómo obtener una URL inversa para una vista genérica?

Si lo uso como el siguiente, el mensaje de error será: NoReverseMatch en/comentarios/añadir/ inversa para '' con los argumentos '()' y argumentos de palabra clave '{}' no encontrado.

en views.py:

urlresolvers.reverse('django.views.generic.list_detail.object_detail') 
       return HttpResponseRedirect(resp) 

en urls.py

common_info_dict = { 
    'extra_context':{ 
     'blogtitle':"Thinking", 
     'blogsubtitle':"- blog system", 
     'articles_count':Entry.objects.count, 
     'comments_count': 0, 
     'visitors_count' : 0, 
     'category_list':Category.objects.all, 
     'tag_list':Tag.objects.all, 
     'comment_form': CommentForm, 
    }, 
} 

object_detail_info_dict = { 
    'queryset': Entry.objects.all(), 
    'slug_field': 'slug', 
    'template_object_name': 'post', 
} 

object_detail_info_dict.update(common_info_dict) 

    urlpatterns += patterns('django.views.generic.list_detail', 
     (r'^posts/(?P<slug>[-\w]+)/$', 'object_detail', object_detail_info_dict), 
    ) 

Respuesta

18

La única forma de utilizar revertir con vistas genéricas - named urls config.

urlpatterns += patterns('django.views.generic.list_detail', 
    (r'^posts/(?P<slug>[-\w]+)/$', 'object_detail', 
          object_detail_info_dict, 'post_detail'), 
) 

reverse('post_detail', args=('foobar',)) 
3

Parece que esta pregunta es para las versiones anteriores de Django. No estoy familiarizado con el funcionamiento de las viejas vistas genéricas. Pero las nuevas vistas genéricas basadas en clases tienen el mismo problema.

La reversión no funciona "de fábrica" ​​porque View.as_view() devuelve una función de contenedor diferente cada vez, y no se comparan entre sí, por lo que reverse() no puede encontrar el reverso ruta comparando dos funciones que no son iguales.

hay otra manera, aunque es no estándar. Esto es lo que hago para mis puntos de vista basados ​​en la clase:

class OrderView(LoginRequiredMixin, CreateView): 
    model = Order 
    form_class = OrderForm 

OrderView.plain_view = staticmethod(OrderView.as_view()) 

En este caso, yo uso plain_view en el sentido de la vista devuelta por as_view() sin argumentos. Si pasa los argumentos al as_view(), entonces el contenedor que devuelve realmente será diferente al simple. Así que si necesitas tanto, habría que asignarlos a diferentes propiedades:

OrderView.plain_view = staticmethod(OrderView.as_view()) 
OrderView.bonk_view = staticmethod(OrderView.as_view(whee='bonk')) 

puede vincular a estos atributos vista en urls.py:

urlpatterns = patterns('', 
    url(r'^order/$', views.OrderView.plain_view), 
    url(r'^frob/$', views.OrderView.bonk_view), 

y luego se puede revertir ellas invirtiendo el los atributos de vista:

def get_success_url(self): 
    return reverse(OrderView.plain_view) 

def get_failure_url(self): 
    return reverse(OrderView.bonk_view) 
+0

esta pregunta decir la esencia del problema, que es mejor. – dspjm

Cuestiones relacionadas