2009-04-03 21 views
8

Đây là câu hỏi làm thế nào để tôi sử dụng ngược lại cho đối tượng generic view_detail?Làm cách nào để nhận URL ngược lại cho chế độ xem chung?

Nếu tôi sử dụng nó như sau, thông báo lỗi sẽ là: NoReverseMatch at/comment/add/ Đảo ngược với '' bằng đối số '()' và đối số từ khóa '{}' không tìm thấy.

trong views.py:

urlresolvers.reverse('django.views.generic.list_detail.object_detail') 
       return HttpResponseRedirect(resp) 

trong urls.py

common_info_dict = { 
    'extra_context':{ 
     'blogtitle':"Thinking", 
     'blogsubtitle':"- blog system", 
     'articles_count':Entry.objects.count, 
     'comments_count': 0, 
     'visitors_count' : 0, 
     'category_list':Category.objects.all, 
     'tag_list':Tag.objects.all, 
     'comment_form': CommentForm, 
    }, 
} 

object_detail_info_dict = { 
    'queryset': Entry.objects.all(), 
    'slug_field': 'slug', 
    'template_object_name': 'post', 
} 

object_detail_info_dict.update(common_info_dict) 

    urlpatterns += patterns('django.views.generic.list_detail', 
     (r'^posts/(?P<slug>[-\w]+)/$', 'object_detail', object_detail_info_dict), 
    ) 

Trả lời

18

Cách duy nhất để sử dụng đảo ngược với quan điểm chung - named urls config.

urlpatterns += patterns('django.views.generic.list_detail', 
    (r'^posts/(?P<slug>[-\w]+)/$', 'object_detail', 
          object_detail_info_dict, 'post_detail'), 
) 

reverse('post_detail', args=('foobar',)) 
3

Câu hỏi này dường như dành cho các phiên bản cũ hơn của Django. Tôi không quen thuộc với cách các chế độ xem chung cũ hoạt động. Nhưng các khung nhìn chung dựa trên lớp mới có cùng một vấn đề.

Đảo ngược không hoạt động "ngoài hộp" vì View.as_view() trả về hàm bao bọc khác nhau mỗi lần và chúng không so sánh với nhau, vì vậy đảo ngược() không thể tìm thấy đảo ngược bằng cách so sánh hai hàm không bằng nhau.

Có một cách khác, mặc dù nó không chuẩn. Đây là những gì tôi làm cho quan điểm dựa trên lớp của tôi:

class OrderView(LoginRequiredMixin, CreateView): 
    model = Order 
    form_class = OrderForm 

OrderView.plain_view = staticmethod(OrderView.as_view()) 

Trong trường hợp này, tôi sử dụng plain_view để có nghĩa là quan điểm được trả về bởi as_view() không có đối số. Nếu bạn chuyển đối số cho as_view(), thì trình bao bọc mà nó trả về sẽ thực sự khác với đối số đơn giản. Vì vậy, nếu bạn cần cả hai, bạn sẽ phải giao cho các thuộc tính khác nhau:

OrderView.plain_view = staticmethod(OrderView.as_view()) 
OrderView.bonk_view = staticmethod(OrderView.as_view(whee='bonk')) 

Bạn có thể liên kết đến các điểm thuộc tính trong urls.py:

urlpatterns = patterns('', 
    url(r'^order/$', views.OrderView.plain_view), 
    url(r'^frob/$', views.OrderView.bonk_view), 

và sau đó bạn có thể đảo ngược chúng bằng cách đảo ngược xem thuộc tính:

def get_success_url(self): 
    return reverse(OrderView.plain_view) 

def get_failure_url(self): 
    return reverse(OrderView.bonk_view) 
+0

Câu trả lời này cho biết bản chất của vấn đề, nó tốt hơn. – dspjm

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