在 Django 中反向参数永远不会被解释

in Django parameter in reverse never gets interpreted

在 Django 1.6 中,我有一个带有 link 的视图,它与参数相反:

edit_link = """<a href="%s"><img src="icon.gif"></a>""" % reverse('bio_filter', args={'ename':row.entity_name})

在我的 urls.py 文件中,与 bio_filter 视图关联的 url 的模式是:

url(
    regex=ur'^filter/(?P<ename>.*)/$',
    view=bio_filter_view,
    name='bio_filter',
),

最后,在bio_filter的views文件中,我有这个功能:

def bio_filter_view(request,ename):

问题是 ename 参数从未获得 entity_name 的值。如果我在函数中打印 ename 变量,值就是 'ename'! 我错过了什么?

此致, 帕特里克

args 需要一个列表或可迭代的位置参数。你应该使用的是 kwargs,关键字参数的缩写,它需要一个命名参数的字典。

reverse('bio_filter', kwargs={'ename': row.entity_name})

您在 url 中看到文字 'ename' 的原因是 args 接受任何可迭代对象。您可以 遍历字典,但您实际上是在遍历它的键。因此,将 {'ename': row.entity_name} 传递给 args 与将 ['ename'] 传递给 args 具有相同的效果!

您应该使用 kwargs 参数而不是 args:

reverse('bio_filter', kwargs={'ename': row.entity_name})

另一种选择是使用正则表达式的位置组:

reverse('bio_filter', args=[row.entity_name])

您可以在此处同时使用 argskwargs

>>>reverse('bio_filter', kwargs={'ename': "entity_value"})
'/filter/entity_value'

>>>reverse('bio_filter', args=["entity_value"])
'/filter/entity_value'