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