Django: URL Обратный пользовательский параметр для соответствия?
Я пытаюсь понять, могу ли я построить url, который будет соответствовать объектам в моей модели с другим полем вместо pk. У меня есть модель, которая имеет много полей, и я был счастлив, используя простое <int:id>
при построении url путей, так что в этом случае:
path("<int:pk>/", ProductDetailView.as_view(), name="product_detail")
Но все изменилось, и мы решили использовать наш старый url regex, поэтому вместо него мы изменили на:
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_]+)/$']
Ваше поле url
содержит в качестве значения:
/nesiojami-kompiuteriai/nesiojami-kompiuteriai/nesiojamas-kompiuteris-acer-sf314-14-i5-8265-8256gb--9618707.html
Это не slug. Slug - это последовательность буквенно-цифровых символов, дефисов и знаков подчеркивания. Но он не должен содержать слеши (/
) или точки (.
).
Если вы хотите включить это, то вы можете работать с конвертером путей <path:…>
[Django-doc], который будет принимать последовательность символов, включая слеш и точку:
path('<path:url>/', ProductDetailView.as_view(), name='product_detail'),
но, возможно, ваше поле url
содержит неправильные данные. Обычно slug создается путем преобразования названия чего-либо в slug с помощью команды slugify(…)
[Django-doc], которая заменит все пробельные символы на дефисы и удалит все символы, которые не являются допустимыми символами slug.