2011-06-26 32 views
22

Một giải pháp: Tìm thấy sau đây django đoạn mà dường như làm việc tốt (http://djangosnippets.org/snippets/2445/)Các manager.urls URLconf bao gồm không có bất kỳ mô hình trong đó

from django.utils.functional import lazy 
from django.core.urlresolvers import reverse 

#Workaround for using reverse with success_url in class based generic views 
#because direct usage of it throws an exception. 

reverse_lazy = lambda name=None, *args : lazy(reverse, str)(name, args=args) 

Rõ ràng, hiện nay là một reverse_lazy chức năng trong thân cây django.


Cập nhật: Lỗi này có cái gì để làm với tôi thực hiện cuộc gọi để đảo ngược bên trong một cái nhìn tổng quát:

class AddObjView(CreateView): 
    form_class = ObjForm 
    template_name = 'manager/obj_add.html' 
    success_url = reverse('manager-personal_objs') 

Đây có phải là không hợp lệ?

Nếu tôi thay vì chung chung ghi một cái gì đó như thế này, nó hoạt động:

def add_obj(request, pk): 
    a=reverse('manager-personal-objs') 
    return HttpResponse(a) 

Tôi có một dự án với 2 ứng dụng trong đó. Mỗi ứng dụng đều có các url và chế độ xem của nó. Cả hai đều làm việc tốt, nhưng trên các ứng dụng quản lý, ngay sau khi tôi tham khảo các chức năng đảo ngược trong quan điểm (xem bất kỳ), tôi nhận được lỗi sau: Loại ngoại lệ: Không đúng cấu hình Giá trị ngoại lệ: bao gồm quản lý urlconf.urls doesn ' t có bất kỳ mô hình trong đó

Các url file:

urlpatterns = patterns('', 
    url(r'^$', ObjView.as_view(), name='manager-obj'), 
    url(r'^add/$', AddObjView.as_view(), name='manager-add_obj'), 
    url(r'^personal/$', PersonalObjsView.as_view(), name='manager-personal_objs'),  

)

Exception Location: ... trang web gói \ django \ core \ urlresolvers.py trong _get_url_patterns, dòng 283

Tôi nhận được lỗi này trong toàn bộ trang web (chỉnh sửa: điều này dường như xảy ra vì một nỗ lực để nhập manager.urls sẽ dẫn đến lỗi). Nếu tôi xóa trình quản lý include.urls, mọi thứ sẽ hoạt động trở lại; nếu tôi xóa cuộc gọi để đảo ngược, mọi thứ đều ổn; nếu tôi cố gắng viết lại manager.urls cho một phiên bản đơn giản hơn, nó tiếp tục với lỗi.

Tôi đã trải qua quá nhiều lần này, dường như không thể tìm thấy điều gì sai trái.

chỉnh sửa: root urls.py

# coding=utf8 
from django.conf.urls.defaults import patterns, include, url 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
from django.views.generic.simple import direct_to_template 

# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    # Uncomment the admin/doc line below to enable admin documentation: 
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
    # Uncomment the next line to enable the admin: 
    url(r'^admin/', include(admin.site.urls)), 

    # Home Page 
    url(r'^$', direct_to_template, {'template': 'home.html'}, name="home"), 

    # manager 
    url(r'^manager/', include('manager.urls')), 

    # writing 
    url(r'^writing/', include('writing.urls')), 
) 

urlpatterns += staticfiles_urlpatterns() 

edit2: Cũng nên lưu ý rằng các url mẫu thẻ hoạt động tốt trong các ứng dụng quản lý và cuộc gọi ngược lại làm việc nếu tôi làm điều đó trên các ứng dụng khác. Ngoài ra, mọi url đều có chế độ xem được viết.

+0

Bạn cũng có thể đăng gốc 'urls.py' không? –

+0

thêm root urls.py –

+0

Một điều tôi luôn làm với các mẫu của mình là đặt các mẫu cụ thể nhất trước tiên. Tôi sẽ đặt các mẫu trang chủ sau các mẫu tệp tĩnh và tôi sẽ đảo ngược thứ tự hoặc các mẫu manager.url của bạn. – Brandon

Trả lời

53

Vấn đề là URLConf của bạn chưa tải xong trước khi chế độ xem lớp của bạn cố gắng đảo ngược URL (AddObjView.success_url).Bạn có hai lựa chọn nếu bạn muốn tiếp tục sử dụng ngược trong quan điểm dựa trên lớp học của bạn:

a) Bạn có thể tạo một get_success_url() phương pháp để lớp học của bạn và làm ngược lại từ đó

class AddObjView(CreateView): 
    form_class = ObjForm 
    template_name = 'manager/obj_add.html' 

    def get_success_url(): 
     return reverse('manager-personal_objs') 

b) Nếu bạn đang chạy trên phiên bản trunk/dev của Django, sau đó bạn có thể sử dụng reverse_lazy https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-lazy

from django.core.urlresolvers import reverse_lazy 

class AddObjView(CreateView): 
    form_class = ObjForm 
    template_name = 'manager/obj_add.html' 
    success_url = reverse_lazy('manager-personal_objs') 

Option "b" là phương pháp ưa thích để làm điều này trong các phiên bản tương lai của Django.

+0

reverse_lazy được bao gồm trong Django 1.4. Cảm ơn @erikow vì đã chỉ ra điều này. – Josh

+4

+1 cho reverse_lazy, bạn phải khởi động lại máy chủ dev để nó có hiệu lực – cerberos

+0

django-nonrel (1.3) với appengine KHÔNG CÓ reverse_lazy – jmoz

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