0

我正在创建一个 Django Web 应用程序,并尝试将页面模型设置为主页(根目录中的页面)。

主页模型只能有一个,主页是通过将homepage变量设置为true来设置的。设置一个为真,将上一个主页设置为假。

# models.py
class Page(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    homepage = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if not self.homepage:
            return super(Page, self).save(*args, **kwargs)
        with transaction.atomic():
            Page.objects.filter(
                homepage=True).update(homepage=False)
            return super(Page, self).save(*args, **kwargs)

    def __str__(self):
        # return self.title + '   |   ' + str(self.author)
        return self.title
# views.py
class HomePage(DetailView):
    model = Page.objects.filter(homepage=True)
    template_name = 'home.html'

在我的views.py 脚本中,我试图获取具有homepage = True并将其显示为DetailView 的模型。

# urls.py
urlpatterns = [
    ...
    path('', HomePage.as_view(), name="home"),
    ...
]
<!-- home.html -->
<h1>Home</h1>

{{ page.body }}

不幸的是,我收到一个错误:

AttributeError at /
'QuerySet' object has no attribute '_default_manager'

我做错了什么,我该如何解决这个问题?

4

1 回答 1

1

我认为错误在这里:

# views.py
class HomePage(DetailView):
    model = Page.objects.filter(homepage=True)
    template_name = 'home.html'

在模型字段中,您必须传递模型,如果要通过传递过滤的查询集来更改上下文数据,则必须通过get_queryset()方法进行

# views.py
class HomePage(DetailView):
    model = Page
    template_name = 'home.html'
    
    def get_queryset(self):
        return Page.objects.filter(homepage=True)
于 2020-11-25T15:42:10.513 回答