Ошибка целостности УНИКАЛЬНА для blog_post.slog, несмотря на создание уникальной функции slug

#django

#django

Вопрос:

Я новичок в django и несколько новичок в python тоже.

Я пытаюсь создать простое приложение для блога, и, как мы все знаем, вы хотите иметь уникальные слагаемые для ссылок на ваш блог. Однако, похоже, я не могу избавиться от этой УНИКАЛЬНОЙ ошибки.

Описание проблемы

Когда я создаю сообщение в блоге, я создаю slug из заголовка. Затем я смотрю, совпадает ли эта пуля с какой-либо другой в базе данных. Если это произойдет, я добавлю небольшую строку в конец.

Тем не менее, база данных продолжает выдавать ошибку IntegrityError.

Что я пробовал

Я использовал import pdb; pdb.stack_trace() его, чтобы попытаться отследить проблему. Мне кажется , это происходит после установки self.object.slug , а затем выполнения self.object.save() . Каким — то образом уникальный slug is , возможно , не передается save.() . Но я не уверен, как отлаживать дальше этого момента. Я был бы признателен за помощь в процессе отладки.

Сбивает с толку то, что я работаю из (функционирующего) приложения django blog. Я не могу найти разницу между моим кодом и этим, и я попытался изменить methods.py и views.py , чтобы он соответствовал коду другого блога, и все же это приложение выдает уникальные пули и не выдает ошибок, в то время как мое нет.

Я также попытался перестроить базу данных и начать с нуля.

Места, которые я не смотрел

get_absolute_url() : Я не знаю, почему это может быть проблемой, но я не пробовал ее отлаживать. Я точно не знаю, как reverse() это работает, и чтение об этом — мой проект на утро.

template.html : Я не уверен, почему шаблон будет проблемой.

Соответствующий код

Пожалуйста, дайте мне знать, если я должен опубликовать что-то еще.

 from .models import post
from .helpers in get_post_slug

class PostCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    model = Post
    template_name = 'post_create.html'
    fields = ['title', 'published_at', 'body']
    success_message = "'%(title)s' was created"

    def form_valid(self, form):
        self.object = form.save()
        self.object.slug = get_post_slug(self.object.title)

        self.object.save()
        return HttpResponseRedirect(self.get_success_url())
 
 from django.utils.text import slugify
from .models import Post
import uuid

def get_post_slug(post_title):
    slug = slugify(post_title)
    if Post.objects.filter(slug=slug).exists():
        slug  = "-"   str(uuid.uuid4())[:8]
    return slug
 
 class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    slug = models.SlugField(null=True, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    published_at = models.DateField(
        default=timezone.now,
        blank=True,
        null=True,
        help_text="Leave blank to keep as draft/unpublished. Use a future date for auto-posting.",)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={"slug":self.slug})

    class Meta:
            ordering = ["-published_at", "-created_at",]
 

Ответ №1:

Удивительно, но я не знаю, почему это сработало.

 class Meta:
            ordering = ["-published_at", "-created_at",]
 

имеет дополнительную запятую. Эта дополнительная запятая мешала созданию slug, вызывая ошибку IntegrityError. Поди разберись.