views:

1688

answers:

6

How can I get the reverse url for a Django Flatpages template

+2  A: 

Write your base urls conf to point to your flatpages. Assume it is under pages:

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

Then write your flatpages as normal:

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'),
)

Then your template just refers to them in the usual fashion:

<div id="pages">
...
    <div class="pagelinks">
        <a href="{% url about %}">ABOUT</a>
    </div>
</div>
hughdbrown
+5  A: 

Include flatpages in your root urlconf:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    ('^pages/', include('django.contrib.flatpages.urls')),
)

Then, in your view you can call reverse like so:

from django.core.urlresolvers import reverse

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

In templates, use the {% url %} tag (which calls reverse internally):

<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>
elo80ka
elo80ka,Thanks for laying that out so well. That looks like even I can follow it. It seems like this violates the DRY principle slightly (I hope I understand what DRY is) but I imagine there is no way around that for this goal.
Travis
+1  A: 

I thought the advantage of Flatpages was you didn't have to create any view stubs or url confs? It's a bit pointless otherwise... if you're creating views and urls you may as well save the flatpage content as template html instead.

try this instead: http://wiki.github.com/0sn/nameremoved/flatpages

Anentropic
+4  A: 

I prefer the following solution (require 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'),
)

In your templates

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

Or in your code

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

That way you don't need to use django.contrib.flatpages.middleware.FlatpageFallbackMiddleware and the reverse works as usual without writing so much code as in the other solutions.

Cheers.

bufh
A: 

Thanks bufh.... I prefer your way :)

h3rd3r
A: 

When you create any flatpage, you need to specify an URL which is saved as part of the model. Hence you can retrieve the URL from any flatpage object. In a template:

{{ flatpage.url }}

Remapping flatpage URLs in urls.py and then having to use reverse sort of defeats the purpose of the flatpages app.

Ludovico Fischer