【问题标题】:How can I get the reverse url for a Django Flatpages template如何获取 Django Flatpages 模板的反向 url
【发布时间】:2010-11-11 19:05:32
【问题描述】:

如何获取 Django Flatpages 模板的反向 url

【问题讨论】:

    标签: django reverse django-flatpages


    【解决方案1】:

    我更喜欢以下解决方案(需要 Django >= 1.0)。

    settings.py

    INSTALLED_APPS+= ('django.contrib.flatpages',)
    

    urls.py

    urlpatterns+= patterns('django.contrib.flatpages.views',
        url(r'^about-us/$', 'flatpage', {'url': '/about-us/'}, name='about'),
        url(r'^license/$', 'flatpage', {'url': '/license/'}, name='license'),
    )
    

    在您的模板中

    [...]
    <a href="{% url about %}"><span>{% trans "About us" %}</span></a>
    <a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
    [...]
    

    或在您的代码中

    from django.core.urlresolvers import reverse
    [...]
    reverse('license')
    [...]
    

    这样您就不需要使用django.contrib.flatpages.middleware.FlatpageFallbackMiddleware,反之亦然,无需像其他解决方案那样编写太多代码。

    干杯。

    【讨论】:

    • 您的解决方案和我的解决方案之间唯一真正的区别(也不需要FlatPageFallbackMiddleware)是使用命名的urlpatterns(正如您指出的那样,1.0 之前不可用)。也就是说,我认为将所有 URL 列在 urlconf 中而不是模板中可能会更好(为了可维护性),但代价是有点冗长。 +1
    【解决方案2】:

    在你的根 urlconf 中包含平面页面:

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        ('^pages/', include('django.contrib.flatpages.urls')),
    )
    

    然后,在您看来,您可以像这样调用 reverse:

    from django.core.urlresolvers import reverse
    
    reverse('django.contrib.flatpages.views.flatpage', kwargs={'url': '/about-us/'})
    # Gives: /pages/about-us/
    

    在模板中,使用 {% url %} 标签(内部调用 reverse):

    <a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>
    

    【讨论】:

    • elo80ka,谢谢你把它布置得这么好。好像连我都能跟上。这似乎稍微违反了 DRY 原则(我希望我了解 DRY 是什么),但我想这个目标没有办法解决。
    • 很好的答案,我唯一想知道的是关于模板。通过在模板中放置“/about-us/”,它违背了目的。如果我进入 django admin 并将 /about-us/ 更改为其他内容,则模板不再起作用。还是我在这里遗漏了什么?
    • @Chris:你说得对……你可能会得到 404。我想说你有几个选择:(a) 使用上下文处理器查找所有平面页面的 URL,并将它们推送到模板中,或者 (b) 使用 Selenium/Webdriver 之类的工具来测试所有 URL 并捕获 404 .哦,还有 (c) 不要使用 Flatpages :)
    【解决方案3】:

    编写您的基本 url 配置文件以指向您的平面页面。假设它在页面下:

    urlpatterns = patterns('',
    ...
        url(r'^pages/', include('project.pages.urls')),
    ...
    )
    

    然后照常编写您的平面页面:

    urlpatterns = patterns('django.views.generic.simple',
        url(regex=r'^resume/$',     view='direct_to_template', kwargs={'template': 'resume.html'}, name='resume'),
        url(regex=r'^about/$',      view='direct_to_template', kwargs={'template': 'about.html'},  name='about'),
        url(regex=r'^books/$',      view='direct_to_template', kwargs={'template': 'library.html'},name='books'),
    )
    

    那么您的模板只是以通常的方式引用它们:

    <div id="pages">
    ...
        <div class="pagelinks">
            <a href="{% url about %}">ABOUT</a>
        </div>
    </div>
    

    【讨论】:

      【解决方案4】:

      在我看来,提到的解决方案都没有充分遵循 DRY 原则,所以我只是这样做了:

      # core/templatetags/hacks.py
      
      from django import template
      
      register = template.Library()
      
      @register.simple_tag
      def flaturl(title):
          """
              Returns the url for a flatpage based on the title.
              NOTE: Obviously the title must be unique.
          """
      
          from django.contrib.flatpages.models import FlatPage
      
          try:
              page = FlatPage.objects.get(title=title)
          except:
              return ""
      
          return page.url
      

      然后在任何需要建立链接的模板中,我都这样做了:

      {% load hacks %}
      ...
      <a href="{% flaturl 'My Page Title' %}">Page Title</a>
      

      我可能会在其中添加一些缓存以保持性能,但这对我有用。

      【讨论】:

        【解决方案5】:

        我同意Anentropic 的观点,如果您需要编写 urlconfs 来使用 Django Flatpages,那么使用它们是没有意义的。直接使用generic views 比如TemplateView 会更直接:

        from django.conf.urls import patterns, url
        from django.views.generic import TemplateView
        
        urlpatterns = patterns('',
            url(r'^about/$', TemplateView.as_view(template_name="about.html"), name="about"),
        )
        

        Flatpages 利用FlatpageFallbackMiddleware,它捕获 404 错误并尝试在您的数据库中为请求的 url 查找内容。主要优点是您不必每次必须更改模板时都直接触摸模板,缺点是需要使用数据库:)

        如果你仍然选择使用Flatpages app,你最好使用get_flatpages模板标签:

        {% load flatpages %}
        <ul>
            {% for page in get_flatpages %}
                <li><a href="{{ page.url }}">{{ page.title }}</a></li>
            {% endfor %}
        </ul>
        

        就我个人而言,我很少引用网站主菜单之外的平面页面,它通过{% include 'includes/nav.html' %} 包含在内,如下所示:

        <ul>
            <li><a href="/about/">About</a></li>
            <li><a href="/credits/">Credits</a></li>
            ...
        </ul>
        

        我不觉得我违反了任何 DRY KISS 之类的:)

        【讨论】:

        • 是的 get_flatpages 非常适合创建页脚菜单、站点地图等。Flatpages also supports 只获取以基本 URL 开头的平面页面:{% get_flatpages '/about/' as about_pages %}
        【解决方案6】:

        我认为 Flatpages 的优点是您不必创建任何视图存根或 url 配置文件?否则这有点毫无意义...如果您正在创建视图和网址,您不妨将平面页面内容保存为模板 html。

        试试这个: https://github.com/0sn/nameremoved/wiki/flatpages

        【讨论】:

          【解决方案7】:

          当您创建任何平面页面时,您需要指定一个作为模型一部分保存的 URL。因此,您可以从任何平面页面对象中检索 URL。在模板中:

          {{ flatpage.url }}
          

          urls.py 中重新映射平面页面 URL,然后必须使用反向排序,这违背了平面页面应用程序的目的。

          【讨论】:

            【解决方案8】:

            您需要重新声明 url conf 并且不能依赖文档鼓励我们使用的官方 'django.contrib.flatpages.urls'

            这不会更难,只需包含在您的urls.py

            from django.conf.urls import patterns, url
            
            urlpatterns += patterns('',
                ...
                url(r'^pages(?P<url>.*)$', 'django.contrib.flatpages.views.flatpage', name='flatpage'),
                ...
            )
            

            现在你可以使用你常用的反向 url 模板标签

            <a href='{% url 'flatpage' url="/about-us/" %}'>About Us</a>
            

            或显示所有平面页面的列表

            <ul>
                {% get_flatpages as flatpages %}
                {% for page in flatpages %}
                    <li><a href="{% url 'flatpage' url=page.url %}">{{ page.title }}</a></li>
                {% endfor %}
            </ul>
            

            【讨论】:

              【解决方案9】:

              正确的 Django>= 1.10:

              urls.py

              urlpatterns += [
                  url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
              ]
              

              在模板内轻松查找:

              {% url "flatpage" url="SOME_URL" %}
              

              其中 SOME_URL 是来自 flatpage.url 字段的值

              【讨论】:

                【解决方案10】:

                据此django documentation for flatpages

                你可以这样做

                {% load flatpages %}
                {% get_flatpages as flatpages %}
                <ul>
                    {% for page in flatpages %}
                        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
                    {% endfor %}
                </ul>
                

                在您的模板中。

                【讨论】:

                • 这对于循环浏览所有平面页面很有用,但如果您只需要特定的平面页面 URL,则效果不佳。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-05-14
                • 2013-08-18
                • 2013-08-23
                • 2021-11-15
                • 1970-01-01
                • 2013-10-04
                • 2011-02-22
                相关资源
                最近更新 更多