- Define a model with a SlugField:
from django.db import models
class YourModel(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(unique=True)
# ... other fields ...
- Install Django's
slugify
to create slugs:
pip install django
- In your views, create a function to generate the slug:
from django.utils.text import slugify
def generate_slug(title):
return slugify(title)
- Override the
save
method in your model to generate the slug before saving:
from django.db import models
from django.utils.text import slugify
class YourModel(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(unique=True)
# ... other fields ...
def save(self, args, *kwargs):
if not self.slug:
self.slug = generate_slug(self.title)
super().save(args, *kwargs)
- Create a URL pattern in your
urls.py
file:
from django.urls import path
from .views import YourModelDetailView
urlpatterns = [
path('your-model/<slug:slug>/', YourModelDetailView.as_view(), name='your_model_detail'),
# ... other patterns ...
]
- In your views, use the slug to retrieve the object:
from django.shortcuts import get_object_or_404
from django.views.generic import DetailView
from .models import YourModel
class YourModelDetailView(DetailView):
model = YourModel
template_name = 'your_model_detail.html'
def get_object(self, queryset=None):
return get_object_or_404(YourModel, slug=self.kwargs['slug'])
- In your template, use the slug in URLs:
<a href="{% url 'your_model_detail' slug=your_model_instance.slug %}">Detail</a>