2012-09-07 18 views
5

si alguien lee Tastypie-Mailinglist: No recibí respuesta allí, así que lo siento por el crossposting aquí.Creación de URL inversas en get_resource_uri

En Tastypie, cambié el patrón de URL de un recurso, porque utilizo otra clave que no sea PK. Esto funciona bien cuando tengo acceso al recurso. Ahora quiero anidar este Recurso en un Recurso padre, pero el Recurso anidado contiene los URI con el PK, no mi clave personalizada. Lo que aprendí es que en mi caso, tengo que cambiar el get_resource_uri del niño.

El método en el recurso de mi hijo (que es un NamespacedResource) tiene el siguiente aspecto:

def get_resource_uri(self, bundle_or_obj): 

    obj = bundle_or_obj.obj if isinstance(bundle_or_obj, Bundle) else bundle_or_obj 

    kwargs={ 
     'resource_name': self._meta.resource_name, 
     'custom_id': obj.custom_id 
     } 

    return self._build_reverse_url('api_dispatch_detail', kwargs=kwargs) 

método de reemplazo url del niño es la siguiente:

def override_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/(?P<custom_id>[-_\w\d]+)%s$" % (
       self._meta.resource_name, 
       trailing_slash() 
      ), 
      self.wrap_view('dispatch_detail'), 
      name="api_dispatch_detail" 
     ), 
    ] 

Pero la aplicación no puede revertir la URL. Obtengo este error:

Reverse for 'api_dispatch_detail' with arguments '()' and keyword arguments '{'custom_id': u'3_ee5-4423', 'resource_name': 'myresource'} not found. 

¿Cómo puedo invertir la URL correctamente?

Gracias de antemano.

Respuesta

2

Las URL internas del sabio siempre necesitan resource_name y api_name kwargs.

Sus kwargs deben contener:

kwargs = { 
    'api_name': 'v1', # Or whatever you have set for your api 
    'resource_name': self._meta.resource_name, 
    'custom_id': obj.custom_id 
} 
+0

perfecta, gracias! – schneck

Cuestiones relacionadas