2012-06-26 29 views
12

Tôi đang sử dụng django-cms với apphook để hiển thị thông tin chi tiết về cuốn sách. Tôi cần trang có móc ứng dụng để chấp nhận một con sên chỉ định sách sẽ hiển thị.django-cms: url được sử dụng bởi apphooks không hoạt động với reverse() hoặc {% url%}

Tôi đã tạo một trang có tên là 'sách' và thêm ứng dụng 'BookDetailApp'.

Đây là những gì tập tin books.cms_app của tôi trông giống như:

class BooksApp (CMSApp): 
    name = _('Book Detail Page Application') 
    urls = ['books.urls'] 

apphook_pool.register(BooksApp) 

Đây là những gì books.urls của tôi trông giống như:

urlpatterns = patterns('', 
    url(r'^(?P<slug>[\w\-]+)?', BookDetailView.as_view(), name='book_detail'), 
) 

Và đây là những gì tập tin books.views của tôi trông giống như:

class BookDetailView (DetailView): 
    model = Book 
    template_name = 'layouts/book-detail.html' 
    context_object_name = 'book' 

Tất cả đều hoạt động tốt khi tôi truy cập trực tiếp vào trang chi tiết của cuốn sách. Vì vậy, hãy http://localhost:8000/books/the-book-slug/ hoạt động chính xác cách tôi muốn.

Vấn đề là tôi cần có thể liên kết đến các trang chi tiết sách cụ thể từ các quảng cáo trên trang chủ và không có phương pháp dự kiến ​​nào đang hoạt động đối với tôi.

Sử dụng PAGE_URL mẫu thẻ từ django-cms không hoạt động bởi vì nó chỉ chấp nhận một đối số, vì vậy tôi không thể cung cấp sên cần thiết để xác định cuốn sách để hiển thị:

<a href="{% page_url 'book_detail' %}">go</a> 

Đúng như dự đoán này chỉ chuyển hướng đến http://localhost:8000/books/ mà ném một lỗi vì slug yêu cầu không được bao gồm.

Vì vậy, các tùy chọn tiếp theo của tôi là sử dụng thẻ mẫu url hoặc xác định hàm get_absolute_url() trên mô hình. Cả hai tùy chọn này đều không hoạt động:

<a href="{% url book_detail book.slug %}">go</a> 

def get_absolute_url(self): 
    return reverse('book_detail', args=[self.slug]) 

Cả hai đều dẫn đến lỗi NoReverseMatch: Reverse for 'book_detail' not found.

Nếu tôi bao gồm sách.hãy gửi conf vào url chính của tôi thì nó hoạt động. Vì vậy, nó sẽ xuất hiện rằng nếu url chỉ được sử dụng bởi một apphook cms nó không thể được đảo ngược bởi django.

Bao gồm sách. Các url chính của tôi có vẻ như một giải pháp bẩn và tôi chắc chắn không muốn mã hóa các url trong mẫu hoặc chức năng get_absolute_url. Cả hai giải pháp này dường như không phải là 'pythonesque'.

Mọi đề xuất?

EDIT:

Xếp chỉ hoạt động nếu tôi sử dụng không gian tên ngôn ngữ. Theo tài liệu chỉ định không gian tên ngôn ngữ không cần thiết.

>>> reverse('en:book_detail', args=[book.slug]) 
+1

Tôi gặp vấn đề tương tự đôi khi trước đây. Tôi nghĩ rằng đây là một lỗi trong django-cms. Theo như tôi nhớ, tôi đã triển khai thẻ mẫu ngược của riêng mình để khắc phục vấn đề này, bởi vì tôi không có đủ thời gian để khắc phục lỗi này trong nguồn và tạo yêu cầu kéo. Điều đó thật tuyệt vời để báo cáo và khắc phục. –

Trả lời

8

Đây là rõ ràng là do ứng dụng của chúng tôi có cms.middleware.multilingual.MultilingualURLMiddleware mà sau đó buộc tất cả {% url %} thẻ mẫu và reverse() chức năng để yêu cầu không gian tên ngôn ngữ.

Vì trang web của chúng tôi không được bản địa hóa, việc xóa phần mềm trung gian đã hoạt động tốt. Tài liệu này dường như không rõ ràng với tôi về điều này và cuối cùng đã tìm thấy câu trả lời từ một nguồn khác.

+0

Có thử nghiệm cho điều này không? Lớp đó dường như đã bị loại bỏ khỏi phần mềm trung gian cms nhưng tôi vẫn không thể nhận được '{% url 'gallery_images' gallery_id = gallery.id%}' để đảo ngược mẫu url của tôi 'url (r '^ (? P \ d +)/$ ',' detail ', name = "gallery_images"), ' –

+2

Có vẻ như đã sửa lỗi kể từ phiên bản 2.4, vui lòng đọc tài liệu trước khi nâng cấp, bạn cần [làm theo một số bước] (http: // docs. django-cms.org/en/3.0.1/upgrade/2.4.html) khi nâng cấp. –

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