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.

Вернуться на верх