2011-04-21 17 views
5

¿Cuál es la forma recomendada de obtener una clase de vista genérica desde el nombre de la url?Django: Obtener clase de vista genérica desde el nombre de la url

url(r'^$', HomeView.as_view(), name='home') 

Así que con 'home' quiero obtener la clase HomeView.

+0

Es posible que desee ir a la inversa: desde el punto de vista de clase nombre al nombre de la URL. ¿Por qué? Porque los nombres de clase son el mundo más altamente estructurado. Por ejemplo, después de un error tipográfico, recibirá un mensaje de error más significativo si la línea ofensiva contiene un nombre que no se resuelve allí mismo. (Para las vistas basadas en clase, haría una ayuda que aplica '.as_view()' para que simplifique tanto la resolución como la notación). –

Respuesta

8

El get_class que obtuve de la siguiente pregunta: Does python have an equivalent to Java Class.forName()?

url = reverse('home') 
resolver_match = resolve(url) 
func = resolver_match.func 
module = func.__module__ 
view_name = func.__name__ 

clss = get_class('{0}.{1}'.format(module, view_name)) 

Esto es lo que me ocurrió con mi mismo Estoy muy abierto a otras respuestas.

6

Inspirado en respuesta Pickels':

import importlib 
from django.core.urlresolvers import reverse, resolve 

view_name = 'my_view_name' 

view_func = resolve(reverse(view_name)).func 
module = importlib.import_module(view_func.__module__) 
view = getattr(module, view_func.__name__) 
1

Django 1.9 introducidas 2 atributos a las funciones que as_view retornos(). view_initkwargs y view_class.

Combinando esto con Pickles' respuesta:

url = reverse('home') 
view = resolve(url).func.view_class 
Cuestiones relacionadas