web-dev-qa-db-fra.com

Comment enregistrer des modèles d'URL de routeur DRF dans Django 2

Mes routeurs DRF spécifient un espace de noms afin que je puisse reverse mes URL:

urls.py:

router = DefaultRouter()
router.register('widget/', MyWidgetViewSet, base_name='widgets')
urlpatterns =+ [
    url(r'/path/to/API/', include(router.urls, namespace='widget-api'),
]

Ce qui, lors de la mise à niveau vers Django 2, donne:

Django.core.exceptions.ImproperlyConfigured: La spécification d'un espace de nom dans include () sans fournir de nom_app n'est pas prise en charge. Définissez l'attribut app_name dans le module inclus ou transmettez plutôt un 2-Tuple contenant la liste des modèles et app_name.

Django 2 requiert maintenantapp_name si la variable namespace kwarg est spécifiée lors de l’utilisation de include. Quelle est la bonne façon de spécifier app_name lorsque les modèles d'URL sont construits par un routeur URL DRF? Je ne pense pas que la documentation est à jour pour Django 2 à ce sujet.

6
Escher

Vous devez mettre app_name = 'x' dans le fichier url.py de votre application. C'est un peu enfoui dans la documentation:
https://docs.djangoproject.com/fr/2.0/topics/http/urls/#id5

Par exemple, si dans /project/project/urls.py vous avez:

path('', include('app.urls', namespace='app'))

Ensuite, dans le fichier url correspondant (dans /project/app/urls.py), vous devez spécifier le paramètre app_name avec:

app_name = 'app'  #the weird code
urlpatterns = [
    path('', views.index, name = 'index'), #this can be anything
] 
9
neuronet

Vous devez inclure le fichier router.urls en tant que tuple et ajouter le nom de l'application au tuple au lieu d'inclure uniquement le fichier router.urls.

Selon votre exemple, vous devriez essayer quelque chose comme:

router = DefaultRouter()
router.register('widget/', MyWidgetViewSet, base_name='widgets')
urlpatterns =+ [
    url(r'/path/to/API/', include((router.urls, 'my_app_name'), namespace='widget-api'),
]
0
juanmhidalgo

L'approche recommandée est

from Django.conf.urls import url, include
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'widget/', MyWidgetViewSet)

urlpatterns = [
    url(r'^path/to/API/', include('rest_framework.urls', namespace='widget-api'))
]

Voir http://www.tomchristie.com/rest-framework-2-docs/tutorial/quickstart#urls

0
Harry Moreno