#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. Поди разберись.