Когда я делаю запись и нажимаю кнопку "PUBLISH BUTTON", появляется ошибка "Blog" Object is not iterable error
Я пробовал много способов, используя фильтр, так как пытался получить один объект, но он все еще не работает. Когда я создаю пост из моего раздела администратора, все работает нормально, но когда я создаю пост из моего фронтэнда с помощью формы, он создает посты, а затем показывает мне, что объект не является итерабельным "NOTE: the posts get created perfect well", но я получаю ошибку итерабельности, а также slug не заполняется автоматически во фронтэнде, как это происходит в бэкэнде в разделе администратора. Любая помощь была бы очень полезна и ускорила бы мою работу. Позвольте мне показать некоторые из моих кодов
views.py
#this is for allowing user to create a new post from the frontend
def blogpost(request):
if request.method == "POST":
form = BlogPostForm(request.POST, request.FILES)
if form.is_valid():
form = form.save(commit=False)
form.creator = request.user
form.save()
messages.success(request, f'Hi, Your Post have been sent for review and would be live soon!')
else:
form = BlogPostForm()
context = {
"form": form
}
return render(request, 'blog/AddPost.html', context)
#this is for listing all the blog posts
def BlogList(request):
posts = Blog.objects.filter(status='published').order_by('-created').values()
categoriess = Category.objects.all()
context = {
'posts': posts,
'categories': categoriess,
}
return render(request, 'blog/bloghome.html', context)
# This is view for blog details
def BlogDetail(request, blog_slug):
post = get_object_or_404(Blog, slug=blog_slug)
# post = Blog.objects.filter(slug=blog_slug)
categories = Category.objects.all()
comments = post.comments.filter(active=True)
new_comment = None
if request.method == "POST":
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.post = post
new_comment.name = request.user
new_comment.save()
else:
comment_form = CommentForm()
forms.py
class BlogPostForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['title', 'slug', 'content', 'image', 'category', 'tags']
models.py
class Blog(models.Model):
title = models.CharField(max_length=10000, null=True, blank=True, verbose_name="Title")
content = models.TextField(verbose_name="Post Content")
slug = models.SlugField(unique=True)
image = models.ImageField(upload_to="blog-images/%Y/%m/%d/", verbose_name="Post Thumbnail")
category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name="Category", null=True)
tags = models.ManyToManyField(Tag, related_name='tags', verbose_name="Tag", null=True)
status = models.CharField(choices=STATUS_CHOICE, default="published", max_length=150, verbose_name='Status')
creator = models.ForeignKey(User, on_delete=models.DO_NOTHING, verbose_name="Creator", null=True)
created = models.DateTimeField(auto_now_add=True ,verbose_name="Created", null=True)
def get_absolute_url(self):
return reverse('blog:blog-details', args=[self.slug])
class Meta:
verbose_name = "Blog Post"
verbose_name_plural = "Blog Posts"
def __str__(self):
return self.title
urls.py
urlpatterns = [
path('', views.BlogList, name="home"),
path('post/<slug:blog_slug>', views.BlogDetail, name="blog-details"),
path('post/categories/<slug:category_slug>', views.category, name="category"),
path('post/tags/<slug:tag_slug>', views.tag, name="tags"),
path('post/create/', views.blogpost, name="add-post"),
Было бы полезно увидеть код вашего шаблона, но вот несколько проблем, которые я вижу.
Во-первых, ваше представление blogpost
. Когда вы выполняете POST-запрос, после сохранения формы и установки сообщения об успехе, перенаправляйтесь в представление BlogDetail
. Как вы закодировали, после сохранения формы снова будет отображаться представление blogpost
, на этот раз с формой, содержащей данные POST-запроса. Посмотрите redirect
здесь.
Во-вторых, в вашем представлении BlogList
вы вызываете .values()
на вашем posts
queryset. Не видя кода вашего шаблона, я не могу сказать, намеренно ли это, но убедитесь, что вы знаете, что возвращает values()
из кверисета. Возможно, вы не захотите его использовать.
В-третьих, ваше представление BlogDetail
ничего не возвращает, вам нужно вернуть HttpResponse, используя, например, render
, как и другие ваши представления.
И последнее замечание: принято называть представления, основанные на функциях, в нижнем регистре, с _ в качестве пробела. CamelCase зарезервирован для представлений, основанных на классах.