【问题标题】:Django: URL Reverse custom parameter to match?Django:要匹配的 URL 反向自定义参数?
【发布时间】:2021-09-17 13:44:44
【问题描述】:

我试图弄清楚我是否可以构建一个 url,它将我的模型中的对象与其他字段而不是 pk 匹配。我有一个包含许多字段的模型,我很高兴在构建 url 路径时使用简单的<int:id>,所以在这种情况下:

path("<int:pk>/", ProductDetailView.as_view(), name="product_detail")

但事情发生了变化,我们决定使用旧的 url 正则表达式,所以我们改为:

path("<slug:url>/", ProductDetailView.as_view(), name="product_detail"),

我们的模型有这个字段:

url = models.TextField(null=True)

我可以很容易地通过 url 过滤掉,像这样: 以model.filter(url='/nesiojami-kompiuteriai/nesiojami-kompiuteriai.html') 为例。

我在尝试为模型实例反转和 url 时遇到问题:

prod = Product.objects.filter(is_deleted=False, category_id=64, url__isnull=False).first()
return reverse("product:product_detail", kwargs={"url": prod.url})

NoReverseMatch at /nesiojami-kompiuteriai/nesiojami-kompiuteriai/
Reverse for 'product_detail' with keyword arguments '{'url': '/nesiojami-kompiuteriai/nesiojami-kompiuteriai/nesiojamas-kompiuteris-acer-sf314-14-i5-8265-8256gb--9618707.html'}' not found. 1 pattern(s) tried: ['product/(?P<url>[-a-zA-Z0-9_]+)/$']

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的 url 字段包含值:

    /nesiojami-kompiuteriai/nesiojami-kompiuteriai/nesiojamas-kompiuteris-acer-sf314-14-i5-8265-8256gb--9618707.html
    

    不是蛞蝓。 slug 是一系列字母数字字符、连字符和下划线。但不允许包含斜线(/)或点(.)。

    如果你想包含它,那么你可以使用&lt;<b>path:</b>…&gt; path converter [Django-doc],它将接受一系列字符,包括斜线和点:

    path('&lt;<strong>path:</strong>url&gt;/', ProductDetailView.as_view(), name='product_detail'),

    但您的 url 字段可能包含错误的数据。通常,通过将某物的标题转换为带有 slugify(…) [Django-doc] 的 slug 来制作 slug,这会将所有空格字符替换为连字符并删除所有不是有效 slug 字符的字符。

    【讨论】:

    • 这就是我要找的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2013-09-26
    • 2012-12-05
    • 2011-11-28
    相关资源
    最近更新 更多