2015-12-04 6 views
25

Neuen Python/Django Benutzer (und in der Tat neu zu SO) entfernt werden:Django: Unterstützung für String-Ansicht Argumente url() ist veraltet und wird in Django 1.10

Beim Versuch, mein Django-Projekt zu migrieren, ich ein Fehler:

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') 

Anscheinend kann das zweite Argument kein String mehr sein. Ich kam, um diesen Code zu erstellen, wie es durch ein Tutorial auf pluralsight.com ist, das lehrt, wie man Django mit einer früheren Version benutzt (ich arbeite gerade mit 1.9). Der Lehrer weist uns an, URL-Muster in urls.py aus den Ansichten zu erstellen, die wir in Apps erstellen. Er lehrt uns eine URLPATTERN wie die folgenden zu erzeugen:

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

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

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 

im views.py einer App "main" zu verweisen, die ich schuf.

Wenn diese Methode veraltet ist, wie übergebe ich das View-Argument nicht als String? Wenn ich die Anführungszeichen nur entfernen, wie in der Dokumentation (https://docs.djangoproject.com/en/1.9/topics/http/urls/) gezeigt, erhalte ich eine Fehlermeldung:

NameError: name 'main' is not defined 

ich versuchte, „Import“ Ansichten oder Haupt des Code in dieser Dokumentation vorgestellt werden:

from . import views 

oder

from . import main 

, die mir gegeben haben:

ImportError: cannot import name 'views' 

und

ImportError: cannot import name 'main' 

Ich glaube, ich dies einen Importfehler nach unten zurückgeführt habe, und zur Zeit, dass die Erforschung ist.

+0

Willkommen beim Stapelüberlauf.Django hat das Layout an einem Punkt so leicht verändert. Ich denke, Sie wollen von den wichtigsten Import-Ansichten, aber ich bin mir nicht sicher ... könnten Sie das versuchen? – Foon

+0

Ja, ich habe auch diese Methode überprüft und es funktioniert auf folgende Weise: Wenn Sie 'von Haupt-Import-Ansichten' verwenden, dann muss Ihr URL-Argument 'url (..., views.home)' sein, nicht 'url (..., main.views.home)' @joey wilhelm veranschaulicht, dass unter – AMadinger

Antwort

48

Ich habe die Antwort auf meine Frage gefunden. Es war in der Tat ein Importfehler. Für Django 1.10 müssen Sie nun die view.py der App importieren und dann das zweite Argument von url() ohne Anführungszeichen übergeben. Hier ist mein Code jetzt in 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) 
] 

ich nichts in der App geändert haben oder view.py Dateien.

Props zu @Rik Poggi zur Veranschaulichung, wie diese Frage in seiner Antwort zu importieren: Django - Import views from separate apps

+1

Volle Offenlegung, hatte ich die Antwort auf meine Frage vor dem Posten gefunden. Ich wollte es posten, damit andere nicht auf die gleiche Jagd gehen müssen. Dies ist das erste Mal, dass ich eine Frage stelle, und wenn das nicht die beste Methode zum Austausch von Informationen ist, informieren Sie mich bitte auf eine bessere Art und Weise. – AMadinger

+0

Bitte markieren Sie Ihre Antwort als Lösung, wenn Sie Ihr eigenes Problem beantwortet haben. – qasimalbaqali

+0

Danke für die Notiz, aber ich kann meine eigene Antwort nicht als Lösung für 2 Tage nach dem Setzen akzeptieren, so scheint es. – AMadinger

8

Sie sollten die folgende Lage sein, zu verwenden:

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

Ich bin nicht ganz sicher, was Ihre Verzeichnisstruktur sieht so aus, aber die Verwendung eines relativen Imports wie from . import X ist für den Fall, dass sich die Dateien im selben Ordner befinden.

+0

Ja! Es scheint, dass das auch funktionieren würde. Ich bevorzuge "import main.views" und dann Aufruf von URL (..., main.views.home) vs. "von Haupt-Import-Ansichten" und Aufruf von URL (..., views.home), weil ich die Ansichten behalten kann Abgerechnet, sobald ich mehrere Apps habe. – AMadinger

1

Sie können Ihre Funktionen verwenden, indem Sie alle diese Liste importieren und jede davon zu urlpatterns hinzufügen.

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), 
] 
+0

Sind quadratische Klammern '[]' jetzt mit Importen erlaubt, sollten Sie '()' verwenden? –

+0

@MosesKoledoye Sie haben Recht. Ich werde Danke korrigieren –

Verwandte Themen