I have a purpose about learning django and rest framework. So I faced a problem when I worked on a tutorial project. The slug value changing every time when the article object updating. If the title value has not changed, I want the slug value not to change either. How can I handle this process?
For example: When I update article but I haven't made any changes to the title field, the slug value also changes.
before update
"title" : "article 1",
"slug" : "article-1",
after update
"title" : "article 1",
"slug" : "article-1-1",
models.py
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
title = models.CharField(max_length=120)
content = models.TextField()
draft = models.BooleanField(default=False) # taslağa kaydetme işlemi
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()
slug = models.SlugField(unique=True, max_length=150, editable=False)
image = models.ImageField(
upload_to="media/post/%Y/%m/%d/", blank=True, null=True)
modified_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="modified_by")
def __str__(self):
return self.title
def get_slug(self):
slug = slugify(self.title.replace("ı", "i"))
unique = slug
number = 1
while Post.objects.filter(slug=unique).exists():
unique = '{}-{}'.format(slug, number)
number += 1
return unique
def save(self, *args, **kwargs):
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
self.slug = self.get_slug()
return super(Post, self).save(*args, **kwargs)
serializers.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ["user", "title", "content", "created", "modified", "slug", "image", "modified_by"]
views.py PostUpdateAPIView Class
class PostUpdateAPIView(RetrieveUpdateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
lookup_field = "slug"
permission_classes = [IsOwner]
def perform_update(self, serializer):
serializer.save(modified_by=self.request.user)