Django 4报错:'Post'对象无'published'属性,寻求解决方案
问题原因
你调用Post.published.all()时出错,是因为Post模型没有定义名为published的模型管理器或QuerySet方法。数据库里的status字段虽然有published这个可选值,但这和模型类上的属性是两回事,不能直接通过Post.published来调用。
解决方案
有两种常用解决方式,按需选择:
方式一:自定义模型管理器(推荐,适合多处复用)
在Post模型中添加一个自定义管理器,专门返回已发布的帖子:
from django.db import models from django.utils import timezone class PublishedManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(status='published') class Post(models.Model): STATUS_CHOICES = ( ('draft', 'Draft'), ('published', 'Published'), ) title = models.CharField(max_length=250) slug = models.SlugField(max_length=250, unique_for_date='publish') author = models.ForeignKey(User, related_name='blog_posts', on_delete=models.CASCADE) body = models.TextField() publish = models.DateTimeField(default=timezone.now) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft') # 保留默认管理器,同时添加自定义的published管理器 objects = models.Manager() published = PublishedManager()
添加后,Post.published.all()就能正常返回所有状态为published的帖子了。
方式二:直接在视图中过滤(快速解决,适合单次使用)
不需要修改模型,直接修改视图里的查询语句,用默认管理器过滤status字段:
def post_list(request): # 替换原来的Post.published.all() object_list = Post.objects.filter(status='published') paginator = Paginator(object_list, 3) page = request.GET.get('page') try: posts = paginator.page(page) except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'blog/post/list.html', {'page': page, 'posts': posts})
内容的提问来源于stack exchange,提问作者labefum
相关产品推荐
相关产品推荐

