web-dev-qa-db-fra.com

Django: la prise en charge des arguments d'affichage de chaîne pour url () est obsolète et sera supprimée dans Django 1.10

Nouvel utilisateur de python/Django (et en fait nouveau sur SO):

Lorsque j'essaie de migrer mon Django, je reçois une erreur:

RemovedInDjango110Warning: Support for string view arguments to url() is deprecated 
and will be removed in Django 1.10 (got main.views.home). Pass the callable instead.   
url(r'^$', 'main.views.home')

Apparemment, le deuxième argument ne peut plus être une chaîne. Je suis venu pour créer ce code tel qu'il est à travers un tutoriel sur pluralsight.com qui enseigne comment utiliser Django avec une version précédente (je travaille actuellement avec 1.9). Le professeur nous instruit pour créer des urlpatterns dans urls.py à partir des vues que nous créons dans les applications. Il nous apprend à créer un urlpattern tel que le suivant:

from Django.conf.urls import url
from Django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', 'main.views.home')
]

faire référence

def home(request):
    return render(request, "main/home.html",
                    {'message': 'You\'ve met with a terrible fate, haven\'t you?'}) #this message calls HTML, not shown, not important for question

dans le views.py d'une application "principale" que j'ai créée.

Si cette méthode est obsolète, comment puis-je passer l'argument vue non pas comme une chaîne? Si je supprime simplement les guillemets, comme indiqué dans la documentation ( https://docs.djangoproject.com/en/1.9/topics/http/urls/ ), j'obtiens une erreur:

NameError: name 'main' is not defined

J'ai essayé d'importer des vues ou des vues principales en utilisant le code présenté dans cette documentation:

from . import views

ou

from . import main

ce qui m'a donné:

ImportError: cannot import name 'views'

et

ImportError: cannot import name 'main'

Je crois que j'ai trouvé cela dans une erreur d'importation, et je fais actuellement des recherches à ce sujet.

27
AMadinger

J'ai trouvé la réponse à ma question. C'était en effet une erreur d'importation. Pour Django 1.10, vous devez maintenant importer le view.py de l'application, puis passer le deuxième argument de url () sans guillemets. Voici mon code maintenant dans urls.py:

from Django.conf.urls import url
from Django.contrib import admin
import main.views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', main.views.home)
]

Je n'ai rien changé dans les fichiers app ou view.py.

Accessoires à @Rik Poggi pour avoir illustré comment importer dans sa réponse à cette question: Django - Importer des vues depuis des applications distinctes

50
AMadinger

Vous devriez pouvoir utiliser les éléments suivants:

from Django.conf.urls import url
from Django.contrib import admin

from main import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.home)
]

Je ne suis pas absolument certain de l'apparence de votre structure de répertoires, mais en utilisant une importation relative telle que from . import X est utilisé lorsque les fichiers se trouvent dans le même dossier les uns que les autres.

8
Joey Wilhelm

Vous pouvez utiliser vos fonctions en les important toutes pour les répertorier et en les ajoutant à urlpatterns.

from Django.conf.urls import url
from Django.contrib import admin

from main.views import(
   home,
   function2,
   function3,
)

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^$', home),
   url(r'^$', function2),
   url(r'^$', function3),
]
2
Harun ERGUL