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.
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
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.
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),
]