5

Tôi muốn làm nổi bật trang hiện tại trong menu điều hướng. Rõ ràng tôi cần phải cung cấp cho các liên kết menu một lớp học như 'hoạt động' khi bạn đang ở trên trang của họ. Đây là một vấn đề cổ điển và tôi đã thấy nhiều giải pháp proposed. Vấn đề của tôi là tôi ghét tất cả chúng và xem xét không ai trong số họ được rất DRY. Ví dụ:Tại sao tôi phải vượt qua RequestContext trong tất cả các câu trả lời của mình?

@register.simple_tag 
def active(request, pattern): 
    import re 
    if re.search(pattern, request.path): 
     return 'active' 
    return '' 

---- 

{% load tags %} 
<div id="navigation"> 
    <a class="{% active request "^/about/" %}" href="/about/">About</a> 
    <a class="{% active request "^/contact/" %}" href="/contact/">Contact</a> 
    <a class="{% active request "^/services/" %}" href="/services/">Services</a> 
</div> 

Thẻ yêu cầu hiện tại của bạn và biểu thức url và trả về 'hoạt động' nếu bạn đang ở trên trang này. Ngoài ra, điều này có thể được thực hiện với các lượt xem có tên hơn là các url nhưng nguyên tắc thì giống nhau.

vấn đề chính của tôi với điều này là chuyển hướng của tôi sẽ được gọi là trên 99% số điểm của tôi và bài viết nào, để có được biến yêu cầu hiện tại tôi vẫn còn có phân tích một RequestContext với mẫu với một cái gì đó như thế này:

def contact(request): 
    # snip ... 
    return render_to_response(
       'contact.html', 
       { 'myvar' : myvar }, 
       context_instance=RequestContext(request)) 

Tại sao tôi cần phải thêm dòng context_instance này vào mỗi chế độ xem của mình khi có lẽ tất cả nhưng một trong số chúng cần biến yêu cầu để nhận url/chế độ xem hiện tại để đánh dấu liên kết đang hoạt động? Điều này có vẻ khủng khiếp ướt, đặc biệt là cho một tính năng mà phải ở phần lớn các trang web django. Tôi muốn yêu cầu được bao gồm theo mặc định và có thể tùy chọn ngăn chặn nó. Tôi không thể tìm thấy một cách để làm điều này trong middleware như tôi không thể đánh chặn các mẫu trước khi kết xuất của nó sau khi xem đã trả lại nó.

Mọi đề xuất?

Trả lời

16

Ý định của bạn có ý nghĩa, bạn sẽ cần RequestContext phần lớn thời gian và hiếm khi nó có thể được bỏ qua một cách an toàn vì lý do hiệu suất. Giải pháp là đơn giản, thay vì sử dụng render_to_responsedirect_to_template shortcut:

from django.views.generic.simple import direct_to_template 

def contact(request): 
    # snip ... 
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar }) 

... hoặc render_to trang trí từ django-annoying:

from annoying.decorators import render_to 

@render_to('template.html') 
def foo(request):   
    bar = Bar.object.all() 
    return {'bar': bar}  
+1

Trình trang trí @render_to rực rỡ! Cảm ơn! – Jimmy

+0

+1 để giới thiệu @render_to! lưu ý rằng [django-annoying] (https://github.com/skorokithakis/django-annoying) đã được thực hiện và di chuyển do không hoạt động – antiplex

+2

4 năm sau đó và Django 1.5 đã xóa 'direct_to_template'. Những gì bây giờ sẽ là cách được đề nghị để làm điều này, mà không sử dụng django-gây phiền nhiễu – Patrick

1

Bạn không nhất thiết phải làm bất cứ điều gì để đánh dấu điều hướng của bạn để cung cấp cho phong cách hiện tại một phong cách khác nhau - có những cách khai báo để làm điều đó bằng cách sử dụng CSS.

Xem câu trả lời của tôi ở đây: Django: Is there a better way to bold the current page link để biết ví dụ.

+0

Đặt tên cho trang của bạn bằng id nội dung là một ý tưởng hay, nhưng thẻ body, cùng với điều hướng, nằm trong mẫu cơ bản. Tôi có thể chặn nó ra và thêm * {% block body_id%} trang của tôi {% endblock%} * vào mỗi mẫu mở rộng nhưng một lần nữa, DRY ở đâu? Có cách nào để tự động hóa điều này? Tôi muốn sử dụng dạng xem có tên là id cơ thể hoặc slugify nó hoặc một cái gì đó, thay vì phải đặt tên rõ ràng và phải duy trì hai tên riêng biệt cho mỗi chế độ xem: một cho chính chế độ xem và một cho id css. – Jimmy

+0

Django-fu của tôi bị gỉ, nhưng thay vì thay đổi từng mẫu mở rộng, bạn có thể chuyển tên CSS từ địa chỉ liên hệ() và gia đình: def contact (request): render_to_response ('contact.html', {'cssClass': ' trang liên hệ ',' myvar ': myvar}, ...)? Vẫn không hoàn toàn KHÔ, nhưng không tệ. – RichieHindle

0

Để tham khảo trong tương lai, người ta có thể sử dụng django-tabs để làm gì OP muốn.