'Best way of linking to a page in Django

I managed to create a URL tag for my index. But right now I'm confused how to add links to other pages.

I put this on my urls.py

url(r'^$', 'index', name='index'),

The next thing I put this tag into the href:

{% url 'index' %}

But what if I wanted to create a new page and would be linking to it. How would I do it the best way?



Solution 1:[1]

Django has updated urlpatterns to take 'path' instead of using url so it's become much more efficient. You don't have to use regex anymore

from django.urls import path
from . import views

urlpatterns=[
    path('', views.index , name='index'),
    path('blog/', views.blog , name='blog'),]

Then in templates, you can use template tagging

<a href="{% url 'index' %}">Index</a>
<a href="{% url 'blog' %}">Blog</a>

If you have multiple apps, you can tag it as follows. For example, if this is under 'post' app:

In post app urls.py:

from django.urls import path
from . import views

app_name = 'post'
urlpatterns=[
    path('', views.index , name='index'),
    path('blog/', views.blog , name='blog'),]

in the project urls.py:

from django.urls import path, include

urlpatterns=[
path('post/', include('post.urls'),]

In templates, you do as following:

<a href="{% url 'post:index' %}">Index</a>
<a href="{% url 'post:blog' %}">Blog</a>

Solution 2:[2]

Just use the same label {% url 'index' %}. You may use each name in urls.py to link to the url.

urls.py

url(r'^archive/$', 'mysite.views.archive',name='archive'),
url(r'^about/$', 'mysite.views.about',name='about'),
url(r'^contact/$', 'mysite.views.contact',name='contact'),

template

<a href="{% url 'about' %}">About</a>
<a href="{% url 'contact' %}">Contact</a>

If you have many apps, use namespace https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces-and-included-urlconfs

Solution 3:[3]

Create a new URL in the same format and give that name instead of index.

Eg:

url(r'^$', 'index', name='index'),
url(r'^new/page/$', 'new', name='new_page'),

{% url 'new_page' %}

Solution 4:[4]

Example:

urlpatterns = patterns('',
                       url(r'^$', views.index, name='index'),
                       url(r'^about/$', views.about', name='about'),
)

Now, in the html template rendered by your views.index you can have:

<a href ="{% url 'about' %}">about</a>

Solution 5:[5]

Use the below syntax:

<a href="{% url 'cart' %}" > Cart page </a>

Where URL 'cart' is the name field in your app URL pattern.

urlpatterns = [
    #Leave as empty string for base url
    path('', views.shop, name="store"),
    path('cart/', views.cart, name="cart"),--------------------->
    path('checkout/', views.checkout, name="checkout"),
    path('shop/',views.shop, name="shop"),

]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 Ajai
Solution 4
Solution 5 Emi OB