Django 反向路由——两个可选参数

Django reverse routes - two optional parameters

我对 Django 及其路由系统有疑问。我相信它可以很强大,但现在我正在努力解决一个我在其他框架中工作时没有遇到过的问题,而且我似乎无法掌握它。值得一提的是,我目前对 Django 没有太多经验。

问题很简单 - 我有一个视图采用两个可选参数,定义如下

def test_view(id=None, grid=None):

这两个参数都是可选的,并且经常不传递。 id 只能是一个整数,grid 永远不会是一个整数(当我不想使用会话时,它是一个特殊的字符串来控制 datagrid)。我有这样定义的路线:

url(a(r'^test_view   (\/(?P<id>\d+))?  (\/(?P<grid>[^\/]+))?   \/?$'), views.test_view, name='test_view'),

这很好用,我在使用单向路线时没有遇到任何问题。但是当我尝试使用反向函数或 url 模板标签时,出现以下错误:

Reverse for 'test_view' with arguments '('20~id~desc~1',)' and keyword arguments '{}' not found.

在这个例子中,我试图在没有 id 的情况下找到 reverse,只使用 grid 参数。我尝试了各种将参数传递给反向函数的方法:

(grid, )
(None, grid)
('', grid)
{id=None, grid=grid}

所有这些都会导致相同或类似的错误。

有没有办法在 Django 中实现这个?也许只是禁用网格参数的酷 URL。这就是我在 PHP 的 Nette 框架中的做法,而不是像这样的 url:'localhost/test_view/1/20~id~desc~1' 我有这样的 url:'localhost/test_view/1?grid=20~id~desc~1' .这已经足够了,但我不知道如何在 Django 中实现它。

正如您在问题中指出的那样,实现此目的的最佳方法是使用标准 GET 查询参数,而不是在路径本身中执行此操作。在 Django 中,您只在视图中执行此操作; URL 本身就是

url(r'^test_view$',  views.test_view, name='test_view'),

然后您通过 localhost/test_view?id=1&grid=20~id~desc~1 请求它。您从 request.GET 获取参数,这是一个类似字典的对象;您可以使用 .get 以便在未提供密钥时不会引发 KeyError。

def test_view(request):
    id = request.GET.get('id')
    grid = request.GET.get('grid')