带有变量的 Django URL 正则表达式

Posted

技术标签:

【中文标题】带有变量的 Django URL 正则表达式【英文标题】:Django URL regex with variables 【发布时间】:2017-06-25 17:16:40 【问题描述】:

希望有人能以此为我指明正确的方向。我已经尝试了几乎所有我能想到的东西,但我似乎无法让它发挥作用。我有一组想在 Django 中匹配的 URL:

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

基本上,我想这样当您访问 www.something.com/django/tabs/ 时,它会将您带到一个启动页面,您可以在其中浏览内容。但是,当您访问第二个 URL 时,它会将您带到一个特定页面,您可以从第一个 URL 浏览到该页面。这个页面是基于数据库中的一个对象呈现的,这就是id号存在的原因。我试图在 URL 正则表达式中解释这一点,但我尝试的任何方法似乎都不起作用。他们都只是把我带到主页。

这是我在主站点文件夹中的 urls.py 中的内容:

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

在应用文件夹中的 urls.py 中:

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

有人能帮我指出正确的方向吗?提前致谢!

【问题讨论】:

【参考方案1】:

您在这里没有遵循正确的方法。查询参数用于稍微改变页面的行为。像添加的过滤器、搜索查询等。

我的建议是您只有一个视图并根据视图中的查询参数呈现不同的模板。

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

在您的alltab 视图中,您可以拥有类似的内容。

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")

希望对你有帮助

【讨论】:

这更有意义。谢谢!【参考方案2】:

这不是定义 urls 模式的首选“django 方式”,我想说:-)

在 django 的精神中会是这样的

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

为此,您可以在应用程序中定义您的 url 模式,例如以这种方式 标签/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'),
]

在你的观点中也有类似的东西

标签/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)
...

你可以关注这个djangotutorial了解更多详情:

【讨论】:

以上是关于带有变量的 Django URL 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Django - 路由控制

Django进阶-路由系统

带有正则表达式的 Django 过滤器

Django

Django框架之正则表达式URL误区

你可以在 Django 模板条件中使用正则表达式吗?