ฉันชอบความสะอาดของ 110j ข้างต้นดังนั้นฉันจึงใช้มันส่วนใหญ่และปรับโครงสร้างใหม่เพื่อแก้ปัญหา 3 ข้อที่ฉันมี:
- นิพจน์ทั่วไปตรงกับ url "home" กับอื่น ๆ ทั้งหมด
- ฉันต้องการURL หลายรายการที่แมปกับแท็บการนำทางเพียงแท็บเดียวดังนั้นฉันจึงต้องการแท็กที่ซับซ้อนมากขึ้นซึ่งรับพารามิเตอร์จำนวนตัวแปร
- แก้ไขปัญหา URL บางอย่าง
นี่คือ:
tags.py:
from django import template
register = template.Library()
@register.tag
def active(parser, token):
args = token.split_contents()
template_tag = args[0]
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % template_tag
return NavSelectedNode(args[1:])
class NavSelectedNode(template.Node):
def __init__(self, patterns):
self.patterns = patterns
def render(self, context):
path = context['request'].path
for p in self.patterns:
pValue = template.Variable(p).resolve(context)
if path == pValue:
return "active" # change this if needed for other bootstrap version (compatible with 3.2)
return ""
urls.py:
urlpatterns += patterns('',
url(r'/$', view_home_method, {}, name='home_url_name'),
url(r'/services/$', view_services_method, {}, name='services_url_name'),
url(r'/contact/$', view_contact_method, {}, name='contact_url_name'),
url(r'/contact/$', view_contact2_method, {}, name='contact2_url_name'),
)
base.html:
{% load tags %}
{% url home_url_name as home %}
{% url services_url_name as services %}
{% url contact_url_name as contact %}
{% url contact2_url_name as contact2 %}
<div id="navigation">
<a class="{% active request home %}" href="home">Home</a>
<a class="{% active request services %}" href="services">Services</a>
<a class="{% active request contact contact2 %}" href="contact">Contact</a>
</div>
<a href="{% url "view:name" %}" {% active_class "view:name" %}>
. คุณสามารถเลือกที่จะใช้มันในการสร้างเพียง" active"
ค่า (โดยผ่านFalse
เป็นอาร์กิวเมนต์ที่สองที่จะแท็ก) ต่อท้ายแอตทริบิวต์ระดับที่มีอยู่ แต่ส่วนใหญ่เชื่อมโยง nav ว่าตัวอย่างคือสิ่งที่ผมใช้