Django: Почему не отображается ошибка валидации? Заголовок - это уникальное поле, которое проверяется в clean_title, но оно просто перенаправляет на профиль?

Итак, моя форма перенаправляет на страницу профиля, и форма сохраняется, если имеет уникальный заголовок, однако эта ошибка валидации не возникает при тестировании.

По сути, мое поле slug является своего рода первичным ключом, который генерируется из заголовка в файле views.py. Я знаю, что это не лучшее решение для первичного ключа, но я подумал, что простой способ сделать его уникальным - это обеспечить, чтобы заголовок тоже был при отправке формы.

Я пробовал старый способ генерировать уникальный slug, но он тоже не работает.

Forms.py

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title", "content", "featured_image", "excerpt", "status"]

    def clean_title(self):
        title = self.cleaned_data['title']
        if Post.objects.filter(title=title).exists():
            raise forms.ValidationError("Title already exists")
        return title

Views.py

class CreatePost(View):

    def get(self, request):
        return render(request, 'create_post.html', {
            'post_form': PostForm,
        })

    def post(self, request):
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.slug = slugify(post.title)
            post.save()

        return HttpResponseRedirect(reverse('profile', args=[request.user]))

Модель поста из models.py

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="blog_posts"
    )
    featured_image = CloudinaryField('image', default='placeholder')
    excerpt = models.TextField(blank=True)
    updated_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    likes = models.ManyToManyField(
        User, related_name='blogpost_like', blank=True)

    class Meta:
        ordering = ["-created_on"]

    def __str__(self):
        return self.title

    def number_of_likes(self):
        return self.likes.count()

пожалуйста, будьте добры, я не профессиональный разработчик... пока :)

конечно. Вы всегда перенаправляли:

 def post(self, request):
    ...
    if form.is_valid():
    ...
    return HttpResponseRedirect(reverse('profile', args=[request.user]))

в вашем случае это должно быть:

 def post(self, request):
    ...
    if form.is_valid():
        ...
        return HttpResponseRedirect(reverse('profile', args=[request.user]))
   return render(request, 'create_post.html', {'post_form': form})

Сначала у вас ошибка на get(). В контексте вы отправляете class PostFrom, а не экземпляр этого класса. Сейчас это работает, шаблон создает пустой экземпляр class PostForm, но логика неправильная.

Мое мнение, попробуйте использовать GCBV в вашем случае CreateView. Это проще, и вы не сможете делать глупых ошибок: CreateView сделает это за вас. :)

Читайте подробнее здесь: https://docs.djangoproject.com/en/4.0/ref/class-based-views/generic-editing/#django.views.generic.edit.CreateView

Вернуться на верх