我在调度程序中有两个指向相同视图的网址
path('posts/top/', posts, name='top'),
path('posts/new/', posts, name='new'),
我希望视图开始如下:
def posts(request, ordering):
...
我想,要传递top
和new
作为参数,应该像这样:
path('posts/<ordering:top>/', posts, name='top'),
path('posts/<ordering:new>/', posts, name='new'),
但这给了我
django.core.exceptions.ImproperlyConfigured: URL route 'posts/<ordering:top>/' uses invalid converter 'ordering'.
因此,作为一种变通方法,我使用了此方法,但它看起来有点脏:
path('posts/top/', posts, name='top', kwargs={'order': 'top'}),
path('posts/new/', posts, name='new', kwargs={'order': 'top'}),
正确的方法是什么?
答案 0 :(得分:7)
您误解了路径转换器的工作方式。第一个元素是类型,这里是str
,第二个元素是调用视图时要使用的参数名称。在这一点上,您自己不会约束允许的值。因此您的路径将是:
path('posts/<str:ordering>/', posts, name='posts')
,当您要反转时,您需要输入相关参数:
{% url 'posts' ordering='top' %}
如果您确实要确保人们只能传递这两个值,则可以在视图中以编程方式进行检查,也可以使用re_path
在路径中使用正则表达式:
re_path(r'^posts/(?P<ordering>top|new)/$', posts, name='posts')