2015-12-04 18 views
25

New python/Django người dùng (và thực sự mới để SO):Django: Hỗ trợ cho chuỗi xem đối số url() bị phản đối và sẽ được loại bỏ trong Django 1.10

Khi cố gắng để di chuyển dự án Django của tôi, tôi nhận được một lỗi:

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

Dường như đối số thứ hai không thể là chuỗi nữa. Tôi đến để tạo ra mã này vì nó là thông qua một hướng dẫn tại pluralsight.com đó là giảng dạy làm thế nào để sử dụng Django với một phiên bản trước (Tôi hiện đang làm việc với 1,9). Giáo viên hướng dẫn chúng tôi tạo urlpatterns trong urls.py từ các chế độ xem mà chúng tôi tạo trong ứng dụng. Ngài dạy chúng ta để tạo ra một URLPATTERN như sau:

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

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

để tham khảo

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 

trong views.py của một ứng dụng "chính" mà tôi tạo ra.

Nếu phương pháp này không được chấp nhận, làm cách nào để chuyển đối số xem không phải là chuỗi? Nếu tôi chỉ cần loại bỏ các dấu ngoặc kép, như thể hiện trong tài liệu (https://docs.djangoproject.com/en/1.9/topics/http/urls/), tôi nhận được một lỗi:

NameError: name 'main' is not defined 

Tôi cố gắng để quan điểm "nhập khẩu" hoặc chính sử dụng mã được trình bày trong tài liệu này:

from . import views 

hoặc

from . import main 

đó đã cho tôi:

ImportError: cannot import name 'views' 

ImportError: cannot import name 'main' 

Tôi tin rằng tôi đã bắt nguồn từ này xuống một lỗi nhập khẩu, và hiện đang nghiên cứu đó.

+0

Chào mừng bạn đến tràn ngăn xếp.Django tại một thời điểm đã thay đổi cách bố trí bao giờ nên hơi. Tôi _think_ bạn muốn từ chế độ xem nhập chính, nhưng không chắc chắn ... bạn có thể thử điều đó không? – Foon

+0

Có, tôi cũng đã kiểm tra phương thức đó và nó hoạt động theo cách sau: nếu sử dụng 'từ chế độ xem nhập chính' thì đối số url của bạn cần phải là 'url (..., views.home)', không 'url (..., main.views.home)' @joey wilhelm minh họa rằng bên dưới – AMadinger

Trả lời

48

Tôi đã tìm thấy câu trả lời cho câu hỏi của mình. Nó thực sự là một lỗi nhập khẩu. Đối với Django 1.10, bây giờ bạn phải import view.py của ứng dụng, và sau đó chuyển đối số thứ hai của url() mà không có dấu ngoặc kép. Đây là mã của tôi ngay bây giờ trong 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) 
] 

Tôi không thay đổi bất kỳ thứ gì trong tệp ứng dụng hoặc view.py.

Props để @Rik Poggi để minh họa làm thế nào để nhập khẩu trong câu trả lời của mình cho câu hỏi này: Django - Import views from separate apps

+1

Công bố đầy đủ, tôi đã tìm thấy câu trả lời cho câu hỏi của mình trước khi đăng câu hỏi đó. Tôi muốn đăng nó để những người khác sẽ không phải đi cùng một cuộc săn đuổi ngỗng. Đây là lần đầu tiên tôi đăng câu hỏi và nếu đó không phải là phương pháp tốt nhất để chia sẻ thông tin, vui lòng thông báo cho tôi một cách tốt hơn. – AMadinger

+0

Hãy đánh dấu câu trả lời của bạn là giải pháp, nếu bạn đã trả lời được vấn đề của chính bạn. – qasimalbaqali

+0

Cảm ơn bạn đã lưu ý, nhưng tôi không thể chấp nhận câu trả lời của riêng tôi như là một giải pháp trong 2 ngày sau khi đặt nó, có vẻ như vậy. – AMadinger

8

Bạn sẽ có thể sử dụng như sau:

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

Tôi không hoàn toàn chắc chắn những gì cấu trúc thư mục của bạn trông giống như, nhưng việc sử dụng nhập tương đối chẳng hạn như from . import X là khi các tệp nằm trong cùng một thư mục với nhau.

+0

Có! Dường như nó cũng sẽ hoạt động. Tôi thích "import main.views" và sau đó gọi url (..., main.views.home) so với "từ chế độ xem nhập chính" và gọi url (..., views.home) vì tôi có thể giữ các chế độ xem chiếm một lần tôi có nhiều ứng dụng. – AMadinger

1

Bạn có thể sử dụng các chức năng của mình bằng cách nhập tất cả các danh sách đó vào danh sách và thêm mỗi một trong số chúng vào mẫu url.

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

Dấu ngoặc vuông '[]' bây giờ được phép nhập khẩu, bạn có nghĩa là sử dụng '()'? –

+0

@MosesKoledoye bạn nói đúng. Tôi sẽ cảm ơn –

Các vấn đề liên quan