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

标签 django django-urls

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

path('posts/top/', posts, name='top'),
path('posts/new/', posts, name='new'),

我希望 View 开始如下:
def posts(request, ordering):
    ...

我想,通过 topnew作为参数,它应该是这样的:
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'}),

正确的做法是什么?

最佳答案

您误解了路径转换器的工作方式。第一个元素是类型,这里是 str ,第二个是调用 View 时使用的参数名称。在这一点上,您不限制允许的值本身。所以你的路径是:

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

当你反转时,你会传入相关参数:
{% url 'posts' ordering='top' %}

如果你真的想确保人们只能传递这两个值,你可以在 View 中以编程方式检查它,或者你可以使用 re_path在您的路径中使用正则表达式:
re_path(r'^posts/(?P<ordering>top|new)/$', posts, name='posts')

关于Django 将已知的确切字符串作为 url 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51420143/

相关文章:

django - Atom 文本编辑器终端无法正常工作

Python Sphinx css 无法在 github 页面上运行

django - 在 Django 站点上找不到页面 404?

python - django 中网站 "root"的正则表达式是什么?

python - 如何删除模板中 django URL 中的尾部斜线?

python - Django + PyMSQL + WSGI

python - 如何在 Django 的表单文件字段中指定 "upload to"路径?

python - Django 上下文处理器和 csrf_token

Django:如何获取当前 URL 标记名(用于分页)?

python - 如何使用一个应用程序满足 Django 中的多个 URL