diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py
index 43c9023..846b24e 100644
--- a/src/servala/core/models/service.py
+++ b/src/servala/core/models/service.py
@@ -578,7 +578,7 @@ class ServiceInstance(ServalaModelMixin, models.Model):
}
class urls(urlman.Urls):
- base = "{self.organization.urls.instances}{self.name}/"
+ base = "{self.organization.urls.instances}{self.name}-{self.pk}/"
update = "{base}update/"
delete = "{base}delete/"
diff --git a/src/servala/frontend/templates/frontend/organizations/dashboard.html b/src/servala/frontend/templates/frontend/organizations/dashboard.html
index b58b720..167c806 100644
--- a/src/servala/frontend/templates/frontend/organizations/dashboard.html
+++ b/src/servala/frontend/templates/frontend/organizations/dashboard.html
@@ -96,7 +96,7 @@
{% for instance in service_instances %}
|
- {{ instance.name }}
|
@@ -117,13 +117,13 @@
|
-
{% if instance.has_change_permission %}
-
diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py
index 6a58a0f..a8f917c 100644
--- a/src/servala/frontend/views/service.py
+++ b/src/servala/frontend/views/service.py
@@ -1,6 +1,6 @@
from django.contrib import messages
from django.core.exceptions import ValidationError
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
from django.shortcuts import redirect
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
@@ -178,7 +178,7 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView
class ServiceInstanceMixin:
model = ServiceInstance
context_object_name = "instance"
- slug_field = "name"
+ pk_url_kwarg = "slug"
def dispatch(self, *args, **kwargs):
self._has_warned = False
@@ -195,7 +195,25 @@ class ServiceInstanceMixin:
)
def get_object(self, **kwargs):
- instance = super().get_object(**kwargs)
+ queryset = kwargs.get("queryset") or self.get_queryset()
+
+ # Get the slug from URL (format: "my-instance-123")
+ slug = self.kwargs.get(self.pk_url_kwarg)
+ if slug is None:
+ raise Http404("No slug provided in URL")
+
+ # Extract pk from the slug (everything after the last dash)
+ try:
+ pk_str = slug.rsplit("-", 1)[-1]
+ pk = int(pk_str)
+ except (ValueError, IndexError):
+ raise Http404(f"Invalid slug format: {slug}")
+
+ try:
+ instance = queryset.get(pk=pk)
+ except ServiceInstance.DoesNotExist:
+ raise Http404("Service instance not found")
+
if not instance.kubernetes_object and not self._has_warned:
messages.warning(
self.request,
|