python Django - AttributeError at /blog/cat1 'NoneType' object has no attribute 'views'

4uqofj5v  于 2024-01-05  发布在  Python
关注(0)|答案(3)|浏览(230)

如果我尝试按类别获取博客文章,我会得到以下错误:AttributeError at /blog/cat 1 'NoneType' object has no attribute 'views' 'cat 1'是我在django管理面板categories are displaying correctly with post but when try to fetch posts by category i am getting error中为测试而创建的类别名称
pls check error image
这是我的models.py文件

  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from django.utils.timezone import now
  4. from ckeditor_uploader.fields import RichTextUploadingField
  5. # Create your models here.
  6. class Post(models.Model):
  7. sno = models.AutoField(primary_key=True)
  8. title = models.CharField(max_length=255)
  9. content = RichTextUploadingField()
  10. thumbnail = models.ImageField(upload_to='featured_image/%Y/%m/%d/')
  11. categories = models.ManyToManyField('Category', related_name='posts')
  12. author = models.CharField(max_length=15)
  13. slug = models.CharField(max_length=255)
  14. views = models.IntegerField(default=0)
  15. timeStamp = models.DateTimeField(blank=True)
  16. def __str__(self):
  17. return self.title + ' by ' + self.author
  18. class Category(models.Model):
  19. name = models.CharField(max_length=50)
  20. class Meta:
  21. verbose_name_plural = "categories"
  22. def __str__(self):
  23. return self.name
  24. class BlogComment(models.Model):
  25. sno = models.AutoField(primary_key=True)
  26. comment = models.TextField()
  27. user = models.ForeignKey(User, on_delete=models.CASCADE)
  28. post = models.ForeignKey(Post, on_delete=models.CASCADE)
  29. parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True)
  30. timestamp = models.DateTimeField(default=now)
  31. def __str__(self):
  32. return self.comment[0:13] + "..." + "by " + self.user.username

字符串
Views.py

  1. from django.shortcuts import render, redirect, get_object_or_404
  2. from blog.models import Post, BlogComment, Category
  3. from django.contrib import messages
  4. from blog.templatetags import extras
  5. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  6. import socket
  7. # Create your views here.
  8. def blogHome(request, tag_slug=None):
  9. allPosts = Post.objects.all().order_by("-timeStamp")
  10. # context = {'allPosts': allPosts}
  11. paginator = Paginator(allPosts, 5)
  12. page = request.GET.get('page')
  13. try:
  14. allPosts = paginator.page(page)
  15. except PageNotAnInteger:
  16. allPosts = paginator.page(1)
  17. except EmptyPage:
  18. allPosts = paginator.page(paginator.num_pages)
  19. return render(request, 'blog/blogHome.html', {'allPosts': allPosts, page:'pages'})
  20. def blogCategory(request, pk):
  21. category = get_object_or_404(Category, pk=pk)
  22. return render(request, "blog/blogCategory.html", {'category': category})
  23. def blogPost(request, slug):
  24. post = Post.objects.filter(slug=slug).first()
  25. post.views = post.views+1
  26. post.save()
  27. # comments
  28. comments = BlogComment.objects.filter(post=post, parent=None)
  29. replies = BlogComment.objects.filter(post=post).exclude(parent=None)
  30. replyDict = {}
  31. for reply in replies:
  32. if reply.parent.sno not in replyDict.keys():
  33. replyDict[reply.parent.sno] = [reply]
  34. else:
  35. replyDict[reply.parent.sno].append(reply)
  36. context = {'post': post, 'comments': comments, 'user': request.user, 'replyDict': replyDict}
  37. return render(request, 'blog/blogPost.html', context)
  38. def postComment(request):
  39. if request.method == 'POST':
  40. comment = request.POST.get('comment')
  41. user = request.user
  42. postSno = request.POST.get('postSno')
  43. post = Post.objects.get(sno=postSno)
  44. parentSno = request.POST.get('parentSno')
  45. # new comment
  46. if parentSno == "":
  47. comment = BlogComment(comment=comment, user=user, post=post)
  48. comment.save()
  49. messages.success(request, 'Your comment has been posted successfully')
  50. # replies
  51. else:
  52. parent = BlogComment.objects.get(sno=parentSno)
  53. comment = BlogComment(comment=comment, user=user, post=post, parent=parent)
  54. comment.save()
  55. messages.success(request, 'Your reply has been posted successfully')
  56. return redirect(f'/blog/{post.slug}')


Urls.py

  1. from django.contrib import admin
  2. from django.urls import path, include
  3. from . import views
  4. urlpatterns = [
  5. path('postComment', views.postComment, name='postComment'),
  6. path('', views.blogHome, name='blogHome'),
  7. path('<str:slug>', views.blogPost, name='blogPost'),
  8. path('category/<category>/', views.blogCategory, name='blogCategory'),
  9. ]


这是我的blogCategory.html模板(如果我渲染模板不正确请帮助我太)

  1. {% extends "base.html" %}
  2. {% block title %} Categories {% endblock title %}
  3. {% block blogactive %} active {% endblock blogactive %}
  4. {% block body %}
  5. <div class="container my-4">
  6. <h2>Related Articles:</h2>
  7. {% if posts == posts %}
  8. <p>No such Category</p>
  9. Your search did not match any documents.<br>
  10. Suggestions: <br>
  11. <ul>
  12. <li>Make sure that all words are spelled correctly.</li>
  13. <li>Try different keywords.</li>
  14. <li>Try more general keywords.</li>
  15. <li>Try fewer keywords.</li>
  16. </ul>
  17. {% endif %}
  18. {% for category in post.categories.all %}
  19. <div class="card mb-3">
  20. <div class="card-body">
  21. <div class="row g-0">
  22. <div class="col-md-4">
  23. <div class="ratio ratio-16x9">
  24. <!-- featured image -->
  25. <img src="{{ post.thumbnail.url }}" class="rounded featured-image-list" alt="{{post.title}}">
  26. </div>
  27. </div>
  28. <div class="col-md-7 ps-md-3 pt-3 pt-md-0 d-flex flex-column">
  29. <h2 class="card-title h3">
  30. <a href="{{ post.slug }}">{{ post.title }}</a>
  31. </h2>
  32. <div class="text-muted">
  33. <small>
  34. Published {{ post.timeStamp }} by <strong>{{ post.author }}</strong>
  35. </small>
  36. </div>
  37. <p class="card-text mb-auto py-2">{{ post.content|safe|striptags|truncatechars:300 }}</p>
  38. <div>
  39. <a href="{{ post.slug }}" class="btn btn-primary">Read more</a> | Categories:
  40. {% for category in post.categories.all %}
  41. <a href="{{ category.name }}">
  42. {{ category.name }}
  43. </a>
  44. {% endfor %}
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. {% endfor %}
  51. </div>
  52. {% endblock body %}


我期待什么:当任何人点击标签,他们应该看到该类别的博客文章

ctehm74n

ctehm74n1#

Raise erroe because**post = Post.objects.filter(slug=slug).first()**return None so.
尝试使用下面的代码片段

  1. post = Post.objects.filter(slug=slug).first()
  2. if post is not None:
  3. # Perform actions with the retrieved post
  4. post.views = post.views + 1
  5. post.save()

字符串
HTML中的变化

  1. <h2 class="card-title h3">
  2. <a href="{% url 'blogPost' slug=post.slug %}">{{ post.title }}</a>
  3. </h2>
  4. -------- and ------
  5. <div>
  6. <a href="{% url 'blogPost' slug=post.slug %}" class="btn btn-primary">Read more</a> | Categories:
  7. {% for category in post.categories.all %}
  8. <a href="{{ category.name }}">
  9. {{ category.name }}
  10. </a>
  11. {% endfor %}
  12. </div>

展开查看全部
fkvaft9z

fkvaft9z2#

这个错误发生时,我们没有模型上的对象,但我们要更新一些表,在这段代码中,你没有任何后对象,所以它没有,所以最好先检查是否有一个后。

  1. post = Post.objects.filter(slug=slug).first()
  2. if post is not None:
  3. post.views += 1
  4. post.save()

字符串

aelbi1ox

aelbi1ox3#

正如错误消息中所提到的,在views.py中,这个函数的第二行出现了一个错误:

  1. def blogPost(request, slug):
  2. post = Post.objects.filter(slug=slug).first()
  3. post.views = post.views + 1 # Here
  4. post.save()

字符串
你会得到这种错误,因为你的模型找不到任何给定slug的记录(在这个例子中是cat1)。对于那个url(blog/cat1),你应该得到一个slug='cat1'的博客,但是正如你提到的,这里的cat1category,而不是slug
您需要在urls.py中进行一些更新并替换此:

  1. path('category/<category>/', views.blogCategory, name='blogCategory'),


  1. path('category/<str:category_name>/', views.blogCategory, name='blogCategory'),


models.py中进行以下更改:

  1. class Category(models.Model):
  2. name = models.CharField(primary_key=True, max_length=50)


views.py中,使用以下内容更新blogCategory()视图:

  1. def blogCategory(request, category_name):
  2. category = category = get_object_or_404(Category, pk=category_name)
  3. return render(request, "blog/blogCategory.html", {'category': category})


然后在你的模板中替换这个:

  1. {% for category in post.categories.all %}
  2. <a href="{{ category.name }}">
  3. {{ category.name }}
  4. </a>
  5. {% endfor %}


  1. {% for category in post.categories.all %}
  2. <a href="{% url 'blogCategory' category.name %}">
  3. {{ category.name }}
  4. </a>
  5. {% endfor %}


这一切都应该工作,但我会建议查看官方文档,以获得更多的经验和项目架构的建议。
以下是一些有用的链接:
Django urls
Django Forum: Best structure for urls
Django templates

展开查看全部

相关问题