【问题标题】:Django: How do I create a generic url routing to views?Django:如何创建到视图的通用 url 路由?
【发布时间】:2010-09-15 03:36:24
【问题描述】:

我有一个非常标准的 django 应用程序,我想知道如何设置 url 路由,这样我就不必将每个 url 显式映射到视图。

例如,假设我有以下视图:Project, Links, Profile, Contact。我不想让我的urlpatterns 看起来像这样:

(r'^Project/$', 'mysite.app.views.project'),
(r'^Links/$', 'mysite.app.views.links'),
(r'^Profile/$', 'mysite.app.views.profile'),
(r'^Contact/$', 'mysite.app.views.contact'),

等等。在Pylons 中,它会很简单:

map.connect(':controller/:action/:id')

它会自动抓取正确的控制器和功能。 Django中有类似的东西吗?

【问题讨论】:

  • 等等,你想让 '^Links/$' 指向 'mysite.app.views.links' 吗?
  • 是的,复制/粘贴错误非常棒。

标签: python django pylons


【解决方案1】:
mods = ('Project','Links','Profile','Contact')

urlpatterns = patterns('',
   *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)

【讨论】:

  • 这给了我一个错误'generator' object has no 'resolve'。我想我知道你要做什么(为元组中的每个字符串编写一个路由),但它正在创建一个 django 无法解析的生成器。
  • 我没有测试它,尝试用 *(...for...) 解开生成器。我正在编辑答案
  • 我现在遇到了一个语法错误。我从来没有见过 * 被这样使用......这应该取消引用像 C 这样的指针吗?你能在发帖前测试一下吗?
  • 它将迭代器扩展为位置参数。我已经测试过了。
  • 你在使用某种库吗?什么版本的python?我尝试的每一种迭代器对象都会出现语法错误。
【解决方案2】:

除非您有非常大量的视图,否则从样式的角度来看,明确地写下来并不算太糟糕。

不过,您可以通过使用 patterns 函数的前缀参数来缩短示例:

urlpatterns = patterns('mysite.app.views',
    (r'^Project/$', 'project'),
    (r'^Links/$', 'links'),
    (r'^Profile/$', 'profile'),
    (r'^Contact/$', 'contact'),
)

【讨论】:

  • 这是真的,但现在我感觉很投入。 :)
【解决方案3】:

您也许可以按照以下方式使用特殊的视图功能:

def router(request, function, module):
    m =__import__(module, globals(), locals(), [function.lower()])
    try:
        return m.__dict__[function.lower()](request)
    except KeyError:
        raise Http404()

然后是这样的 urlconf:

(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}),

此代码未经测试,但总体思路应该可行,尽管您应该记住:

显式优于隐式。

【讨论】:

    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2020-01-21
    • 2014-03-26
    相关资源
    最近更新 更多