You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:12:11