Reputation: 57
When updating an existing topic in the admin panel, the slug value changes.
An example in the first update is:
post / testpost.
The next update appears as:
post / testpost-1
Because the value changes when I return to my site and refresh my page;
For this reason, I get a Page not found error (404)
How do I fix this problem?
models.py
class Post(models.Model):
slug = models.SlugField(unique=True, editable=False, max_length=130, null=True, blank=True, allow_unicode=True)
def get_unique_slug(self):
slug = slugify(self.title.replace('ı', 'i'))
unique_slug = slug
counter = 1
while Post.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, counter)
counter += 1
return unique_slug
def save(self, *args, **kwargs):
self.slug = self.get_unique_slug()
return super(Post, self).save(*args, **kwargs)
views.py
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug)
def post_update(request, slug):
if not request.user.is_superuser:
return HttpResponse ("Lütfen giriş yapınız")
post = get_object_or_404(Post, slug=slug)
form = PostForm(request.POST or None, request.FILES or None, instance=post)
if form.is_valid():
form.save()
messages.success(request, 'Başarılı bir şekilde güncellediniz.')
return HttpResponseRedirect(post.get_absolute_url())
context = {
'form': form,
}
return render(request, 'post/form.html', context)
def post_delete(request, slug):
if not request.user.is_superuser:
raise Http404()
post = get_object_or_404(Post, slug=slug)
post.delete()
return redirect('post:index')
url.py
urlpatterns = [
path('index/',views.post_index, name='index'),
path('create/',views.post_create, name='create'),
path('<slug>',views.post_detail, name='detail'),
path('<slug>/update/',views.post_update, name='update'),
path('<slug>/delete/',views.post_delete, name='delete'),
]
Upvotes: 0
Views: 83
Reputation: 88619
I think you forgot to put a if... condition in your save method, try the below,
class Post(models.Model):
# other code
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_unique_slug()
return super(Post, self).save(*args, **kwargs)
Upvotes: 1