Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create href link from one Django app to another

Tags:

django

I know this has been asked multiply times before, but I still don't get it.
How can I create a href-link in one Django app that sends the user to a 2nd app?

This is my setup:

myproject/
  manage.py
  myproject/
    __init__.py
    settings.py
    urls.py
    asgi.py
    wsgi.py

  app1/
    migrations/
    templates/
      app1/
        app1.html
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py

  app2/
    migrations/
    templates/
      app2/
        app2.html
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py

myproject/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls'), name='app1'),
    path('app2/', include('app2.urls'), name='app2'),
]

myproject/settings.py

INSTALLED_APPS = [
    'app1.apps.App1Config',
    'app2.apps.App2Config',
    'django.contrib.admin',
...
]

app1/urls.py (analogous for app2)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.app1, name='app1'),
    ]

app1/views.py (analogous for app2)

from django.template import loader
from django.http import HttpResponse

def app1(request):
    template = loader.get_template('app1/app1.html')
    return HttpResponse(template.render())

app1/templates/app1/app1.html (analogous for app2)

<p>This is the template of app1.</p>
<a href="app2/">Go to App2</a> # doesn't work
<a href="app2/app2.html">Go to App2</a> # doesn't work
<a href="./app2/app2.html">Go to App2</a> # doesn't work

My problem is that this sends me to the address 127.0.0.1:8000/app1/app2/ which gives me a 404 error. However, I can access app2 via 127.0.0.1:8000/app2/ without a problem.

Edit:
Thanks everyone for your feedback. After going through your suggestions, I made the following changes:

myproject/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls', namespace='app1')), # ADDED NAMESPACE
    path('app2/', include('app2.urls', namespace='app2')), # ADDED NAMESPACE
]

myproject/settings.py: no changes

app1/urls.py: (analogous for app2)

from django.urls import path
from . import views

app_name = 'app1' # THIS WAS MISSING
urlpatterns = [
    path('', views.app1, name='app1'),
    ]

app1/views.py: no changes

app1/templates/app1/app1.html: (analogous for app2)

<p>This is the template of app1.</p>
<a href="{% url 'app2:app2' %}">Go to App2</a> # AS SUGGESTED BY seif

Now it works.

like image 772
Staehlo Avatar asked Sep 15 '25 01:09

Staehlo


1 Answers

in your template and views try not to hardcode the url of href instead use the {%url ''%} which will be {%url 'namespace:urlname'%}

<p>This is the template of app1.</p>
<a href="{% url 'app2:app2'%}">Go to App2</a>

this give you flexibility to change the path in your urls and not to worry about changing it at all your templates and views you can read more here https://docs.djangoproject.com/en/3.1/topics/http/urls/#reverse-resolution-of-urls

like image 180
seif Avatar answered Sep 16 '25 14:09

seif