Django 将已知的确切字符串作为 url 参数传递

问题描述 投票:0回答:2

我在调度程序中有两个 url 指向相同的视图:

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': 'new'}),

正确的做法是什么?

python django path django-urls path-converters
2个回答
19
投票

你误解了路径转换器的工作方式。第一个元素是类型,这里是

str
,第二个是调用视图时要使用的参数名称。此时您不限制允许值本身。所以你的路径是:

path('posts/<str:ordering>/', posts, name='posts')

当你来reverse的时候传入相关参数:

{% url 'posts' ordering='top' %}

如果你真的想确保人们只能传递这两个值,你可以在视图中以编程方式检查它,或者你可以使用

re_path
在你的路径中使用正则表达式:

re_path(r'^posts/(?P<ordering>top|new)/$', posts, name='posts')

0
投票

我在下面遇到了同样的错误:

django.core.exceptions.ImproperlyConfigured: URL 路由 'test//' 使用无效的转换器“id”。

因为我使用

id
作为转换器如下图:

urlpatterns = [
    path('test/<id:id>/', views.test, name="test")
]              # ↑ Converter

所以,我使用

int
作为转换器如下图,然后错误就解决了:

urlpatterns = [
    path('test/<int:id>/', views.test, name="test")
]              # ↑ Converter

此外,根据

文档
str
int
slug
uuid
path转换器默认可用。

© www.soinside.com 2019 - 2024. All rights reserved.