Django URL regex with variables

帅比萌擦擦* 提交于 2019-12-08 03:45:38

问题


Was hoping someone could point me in the right direction with this. I've tried nearly everything I can think of, but I can't seem to get it to work. I've got a set of URLs I'd like to match in Django:

www.something.com/django/tabs/
www.something.com/django/tabs/?id=1

Basically, I want to make it so that when you just visit www.something.com/django/tabs/ it takes you to a splash page where you can browse through stuff. When you visit the second URL however, it takes you to a specific page which you can browse to from the first URL. This page is rendered based on an object in the database, which is why the id number is there. I've tried to account for this in the URL regex, but nothing I try seems to work. They all just take me to the main page.

This is what I have in urls.py within the main site folder:

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

and within urls.py in the app's folder:

urlpatterns = [
    url(r'\?id=\d+$', tab),
    url(r'^$', alltabs)
]

Would anyone be so kind as to point me in the right direction? Thanks in advance!


回答1:


You are not following the right approach here. Query paramers are used to change the behaviour of the page slightly. Like a added filter, search query etc.

What i would suggest is you have only one view and render different templates based on query parameters in the view.

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

In your alltab views you can have something like this.

def alltabs(request):
    if request.GET.get("id"):
        id = request.GET.get("id")
        your_object = MyModel.objects.get(id=id)

        return render_to_response("tab.html", {"object":your_object})
    return render_to_response("alltab.html")

Hope this helps




回答2:


This is not the preferred 'django way' of defining urls patterns, I would say:-)

In the spirit of django would be something like

www.something.com/django/tabs/
www.something.com/django/tabs/1/
....
www.something.com/django/tabs/4/

and for this you define your url patterns within the app for example this way tabs/urls.py:

from django.conf.urls import url

from . import views

urlpatterns = [
    # ex: /tabs/
    url(r'^$', views.index, name='index'),
    # ex: /tabs/5/
    url(r'^(?P<tab_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /tabs/5/results/
    url(r'^(?P<tab_id>[0-9]+)/results/$', views.results, name='results'),
]

and something similar in your views

tabs/views.py:

from django.shortcuts import get_object_or_404, render
from tabs.models import Tab

def index(request):
    return render(request, 'tabs/index.html')

def detail(request, tab_id):
    tab = get_object_or_404(Tab, pk=tab_id)
    return render(request, 'tabs/detail.html', {'tab': tab})
...

You can follow this django tutorial for more details:



来源:https://stackoverflow.com/questions/42107175/django-url-regex-with-variables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!