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

时间:2015-10-21 08:13:31

标签: python django url router

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

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

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

这两个参数都是可选的,通常不会传递。 Id只能是一个整数,网格永远不会是一个整数(当我不想使用会话时,它是一个控制数据网格的特殊字符串)。我有一个像这样定义的路线:

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.

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

(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?格= 20〜ID〜降序〜1' 。这将是完全足够的,但我不知道如何在Django中实现这一点。

1 个答案:

答案 0 :(得分:3)

正如您在问题中所述,实现此目的的最佳方法是使用标准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')