SumNeuron
SumNeuron

Reputation: 5188

Django: point url behind root of app?

I am going through Django's tutorials (Django tutorial part 3) and I am at the part where we are adding views and urls.

In this demo app they add subviews for polls, e.g. /polls/34/ to get to the 34th poll. Quoting from the tutorial:

When somebody requests a page from your website – say, “/polls/34/”, Django will load the mysite.urls Python module because it’s pointed to by the ROOT_URLCONF setting. It finds the variable named urlpatterns and traverses the regular expressions in order. After finding the match at '^polls/', it strips off the matching text ("polls/") and sends the remaining text – "34/" – to the ‘polls.urls’ URLconf for further processing. There it matches r'^(?P<question_id>[0-9]+)/$', resulting in a call to the detail() view like so:

My question is as follows:

suppose you have a view that is related to your app, but where the url - prepended by the app name - makes less sense than just the new view by itself. How could you make a view (which is part of the app) start at a new path name.

This might be confusing so here is an example.

Suppose you have an app (decks) for decks users make out of a set of cards. Then /deck/regex would take you to a given deck. If someone wanted to see more information about a card in the deck then /decks/cards/regex makes less sense then /cards/regex as a card can be in multiple decks.

It isn't a perfect example, but I think it highlights what I am trying to do.

Upvotes: 0

Views: 1142

Answers (2)

Nam Nguyễn
Nam Nguyễn

Reputation: 597

I had some type of URL for you: 1st:

# The url in Projects, which you have to include to link your app.
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^table/', include('table.urls')),
]

This upper case is your code now:

# So you can change is to:
urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^', include('table.urls',namespace="table")),
]

And then: in tables.urls.py you can do what ever you want:

urlpatterns = [ url(r'^$', views.index, name='index'),
     url(r'^decks/(?P<pk>.*)$', views.decksView, name='decksView'),
     url(r'^card/(?P<pk>.*)$', views.cardView, name='cardView'),
]

Upvotes: 1

crazyglasses
crazyglasses

Reputation: 540

What you are saying can easily be done but it is not done so because it causes a lot of confusion with regards to routing.

Talking about your decks example. Lets say you are in an app called decks, where root urls.py file is this :

from django.conf.urls import url,include
from django.contrib import admin
from Decks import views as deckviews


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'/cards/regex^$',deckviews.get_card_information),
    url(r'^decks/',include('deckviews.urls')),

 ]

and the urls.py in Decks app can be:

from django.conf.urls import url,include
import views

urlpatterns = [
    url(r'^regex/',views.generate_decks)

 ]

Here is an example where to generate decks, the decks/regex calls the generate random decks from within the urls.py of the decks app meanwhile you get your desired cards/regex which points to the views inside the decks app but still has the url that you wish for.

This ways you can route any url to any function and thats the beauty of django. This is rarely used though as it creates a lot of confusion when the apps get bigger and more complex.

Hope this helps. Cheers!

Upvotes: 1

Related Questions