2015-12-04 1 views
25
utente

Nuova Python/Django (e in effetti una novità per SO):Django: Supporto per Visualizza String argomenti url() è deprecato e sarà rimosso in Django 1.10

Quando si tenta di migrare il mio progetto Django, ottengo un errore:

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

Apparentemente il secondo argomento non può più essere una stringa. Sono venuto a creare questo codice come è attraverso un tutorial su pluralsight.com che insegna come usare Django con una versione precedente (attualmente sto lavorando con 1.9). L'insegnante ci insegna a creare urlpatterns in urls.py dalle viste che creiamo nelle app. Egli ci insegna a creare un URLPATTERN come la seguente:

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

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

di riferimento

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 

nel views.py di un app "principale" che ho creato.

Se questo metodo viene deprecato, come faccio a passare l'argomento vista non come stringa? Se ho appena rimuovere le virgolette, come indicato nella documentazione (https://docs.djangoproject.com/en/1.9/topics/http/urls/), ottengo un errore:

NameError: name 'main' is not defined 

ho cercato di vista "di importazione" o principale utilizzando il codice presentato in questa documentazione:

from . import views 

o

from . import main 

che mi ha dato:

ImportError: cannot import name 'views' 

e

ImportError: cannot import name 'main' 

Credo di aver rintracciato questo fino a un errore di importazione, e attualmente sto ricercando questo.

+0

Benvenuto per impilare.Django a un certo punto ha cambiato leggermente il layout. Penso che vuoi dalle viste di importazione principali, ma non sono sicuro ... potresti provarlo? – Foon

+0

Sì, ho verificato anche questo metodo e funziona nel modo seguente: se si utilizza 'dalle viste di importazione principali', quindi l'argomento dell'URL deve essere 'url (..., views.home)', non 'url (..., main.views.home)' @joey wilhelm illustra che al di sotto di – AMadinger

risposta

48

Ho trovato la risposta alla mia domanda. Era davvero un errore di importazione. Per Django 1.10, ora devi importare view.py dell'app e quindi passare il secondo argomento di url() senza virgolette. Ecco il mio codice ora 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) 
] 

non ho cambiato nulla nella app o file view.py.

Props a @Rik Poggi per illustrare come importare nella sua risposta a questa domanda: Django - Import views from separate apps

+1

completa divulgazione, avevo trovato la risposta alla mia domanda prima di postarla. Volevo pubblicarlo in modo che gli altri non dovessero andare nella stessa caccia all'oca. Questa è la prima volta che invio una domanda e, se questo non è il metodo migliore per condividere le informazioni, ti prego di informarmi in un modo migliore. – AMadinger

+0

Per favore segna la risposta come soluzione, se hai risposto al tuo problema. – qasimalbaqali

+0

Grazie per la nota, ma non posso accettare la mia risposta come soluzione per 2 giorni dopo averla postata, a quanto pare. – AMadinger

8

Si dovrebbe essere in grado di utilizzare il seguente:

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

io non sono assolutamente certo che cosa la struttura della directory è simile, ma l'utilizzo di un'importazione relativa come from . import X si riferisce a quando i file si trovano nella stessa cartella l'uno dell'altro.

+0

Sì! Sembra che funzionerebbe pure. Preferisco "import main.views" e poi chiamando url (..., main.views.home) vs. "dalle principali viste di importazione" e chiamando url (..., views.home) perché posso mantenere le viste ha rappresentato una volta ho più app. – AMadinger

1

È possibile utilizzare le funzioni importandole tutte e aggiungendole a 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), 
] 
+0

Le parentesi quadre '[]' ora sono consentite con le importazioni, intendevi usare '()'? –

+0

@MosesKoledoye hai ragione. Correggerò grazie –