【问题标题】:Continue url match if request is not resolved - Django如果请求未解决,则继续 url 匹配 - Django
【发布时间】:2014-01-03 21:19:49
【问题描述】:

我不确定它是否非常具体,但我认为我要问的是在不同情况下的不同地方使用。我的问题主要与我为 Django 应用程序创建的 URL 模式有关。我需要所有应用程序用户的个人资料 URL,因此我正在创建如下 URL 模式。

urlpatterns = patterns('apps.user_profile.views',
    url(r"^(?P<username>\w+)/$", 'user_profile', name="user_profile_page"),
    url(r"^app/$", 'app', name="app_page"),
)

很清楚,我在路径中使用用户名映射 URL 以动态获取用户数据。这工作正常,但是当系统收到app 页面的请求时,问题就来了。在这种情况下,请求转到用户配置文件,因为它接受所有类型的单词并在urls.py 中的app 视图之前排序。

问题: 有什么方法可以指定在user_profile 视图中未解决请求的情况下,继续查看应用程序的urls.py 中的其他URL?

【问题讨论】:

    标签: python django django-views django-urls


    【解决方案1】:

    模式按照它们写入的顺序进行匹配,因此只需在用户名模式之前移动您的 app 模式即可解决您的问题:

    urlpatterns = patterns('apps.user_profile.views',
        url(r"^app/$", 'app', name="app_page"),
        url(r"^(?P<username>\w+)/$", 'user_profile', name="user_profile_page"),
    
    )
    

    现在,只有当 url 匹配 app/ 时,它才会被发送到您的用户资料视图。

    当然,在用户使用app 用户名注册的那一天,您就会遇到问题。

    【讨论】:

    • 将正则表达式更改为 ^users/(?P&lt;username&gt;\w+)/$ 可能会有所帮助。或者更好的是,将^users/ 映射到另一个urls.py 并在此处使用(?P&lt;username&gt;\w+)/$
    • @burhan:我可以将应用程序放在用户个人资料 url 之前,但在这种情况下,它会影响我项目中其他应用程序的 url,它位于 user_profile 应用程序之后。
    • @xbello 是的,我可以将其保留为^users/(?P&lt;username&gt;\w+)/$,但没有其他方法可以实现。它看起来很普通的功能。
    • 将您的用户名配置文件 URL 作为最后一个 URL,因为它匹配任何 URL。
    • @lalit,您要求的是将 url 调度程序放在视图函数中,即如果 url 以“app”开头,则调用 user_profile() 函数的 user_profile() 函数。我认为这是可能的,但是您的代码将从一开始就被破坏。使用 Django 调度程序。查看 stackoverflow 中的 url:它们以“app”名称(用户、问题、标签、未回答...)开头,这使得扩展站点非常容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2014-01-31
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多