首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django导航?

Django导航?
EN

Stack Overflow用户
提问于 2017-12-27 00:58:54
回答 3查看 0关注 0票数 0

我刚刚在django做了我的第一个小webapp,。 我即将开始将旧生产PHP站点转换为Django,作为其模板的一部分,有一个导航栏。

在PHP中,我检查每个导航选项的URL与模板代码中的当前URL,并应用一个CSS类,如果他们排队。 这是可怕的凌乱。

有没有更好的Django或在模板中处理代码的好方法?

开始,我将如何去获取当前的网址?

EN

回答 3

Stack Overflow用户

发布于 2017-12-27 08:44:10

你可以使用模板继承来自定义导航。例如:

base.html

代码语言:javascript
复制
<html>
    <head>...</head>
    <body>
        ...
        {% block nav %}
        <ul id="nav">
            <li>{% block nav-home %}<a href="{% url home %}">Home</a>{% endblock %}</li>
            <li>{% block nav-about %}<a href="{% url about %}">About</a>{% endblock %}</li>
            <li>{% block nav-contact %}<a href="{% url contact %}">Contact</a>{% endblock %}</li>
        </ul>
        {% endblock %}
        ...
    </body>
</html>

约.html

代码语言:javascript
复制
{% extends "base.html" %}

{% block nav-about %}<strong class="nav-active">About</strong>{% endblock %}
票数 0
EN

Stack Overflow用户

发布于 2017-12-27 09:11:28

你不需要一个if来完成这个任务,请查看以下代码:

tags.py

代码语言:javascript
复制
@register.simple_tag
def active(request, pattern):
    import re
    if re.search(pattern, request.path):
        return 'active'
    return ''

urls.py

代码语言:javascript
复制
urlpatterns += patterns('',
    (r'/$', view_home_method, 'home_url_name'),
    (r'/services/$', view_services_method, 'services_url_name'),
    (r'/contact/$', view_contact_method, 'contact_url_name'),
)

base.html

代码语言:javascript
复制
{% load tags %}

{% url 'home_url_name' as home %}
{% url 'services_url_name' as services %}
{% url 'contact_url_name' as contact %}

<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 %}" href="{{ contact }}">Contact</a>
</div>

就这样。有关实现细节,请参阅:

gnuvince.wordpress.com

110 j.wordpress.com

票数 0
EN

Stack Overflow用户

发布于 2017-12-27 10:27:12

以下解决上面的三个问题:

  1. 正则表达式将“home”url与所有其他的url匹配。
  2. 我需要映射到一个导航选项卡的多个URL,因此,我需要一个更复杂的标记,它接受可变数量的参数。
  3. 修正了一些url问题

这里是:

代码语言:javascript
复制
## 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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档