1

I'm trying to figure out if I can build a url which would match objects in my model with other field instead of pk. I have a model which has many fields, and I was happy while using simple <int:id> while building url paths, so in this case:

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

But things changed, and we decided to use our old url regex, so instead this we changed to:

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

Our model have this field:

url = models.TextField(null=True)

and I can easily filter out by url, like this: model.filter(url='/nesiojami-kompiuteriai/nesiojami-kompiuteriai.html') for example.

I have a problem while trying to reverse and url for the model instance:

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_]+)/$']

1 Answer 1

2

Your url field contains as value:

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

This is not a slug. A slug is a sequence of alphanumerical characters, hyphens and underscores. But it is not allowed to contain slashes (/), or dots (.).

If you want to include this, then you can work with a <path:…> path converter [Django-doc], which will accept a sequence of characters including the slash and dot:

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

but perhaps your url field contains the wrong data. Typically a slug is made by transforming the title of something into a slug with slugify(…) [Django-doc] this will replace all spacing characters with hyphens and remove all characters that are not valid slug characters.

Sign up to request clarification or add additional context in comments.

1 Comment

That's what I was looking for, thanks man!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.