首页 > 解决方案 > Wagtail:获取兄弟姐妹属性

问题描述

我正在创建投资组合应用程序。在内页上,我想给出一个链接到下一个投资组合记录的缩略图。

Wagtail:获取上一个或下一个兄弟姐妹- 这是有关如何获取 url 的答案。但它不适用于获取其他属性。

如果我在此方法中更改“url”:

def next_portfolio(self):
    if self.get_next_sibling():
        return self.get_next_sibling().url
    else:
        return self.get_siblings().first().url

获取不是“.url”而是“.thumbnail”

def next_portfolio(self):
    if self.get_next_sibling():
        return self.get_next_sibling().thumbnail
    else:
        return self.get_siblings().first().thumbnail

我得到的只是一个错误“'Page'对象没有属性'thumbnail'”。但它有。这就是我的模型的样子:

class PortfolioItem(Page):
    thumbnail = models.ImageField(upload_to = '', default = None)
    is_feautered = models.BooleanField(default=False)

def next_portfolio_thumb(self):
    if self.get_next_sibling():
        return self.get_next_sibling().thumbnail
    else:
        return self.get_siblings().first()

这应该是获得兄弟属性的明显方法。你能指点我怎么做吗?

标签: pythondjangodjango-querysetwagtail

解决方案


所以这个问题的答案如下。名为@gasman 的用户在这里回答:Wagtail单元测试:添加子页面会将它们转换为基本类型,以了解如何获取特定页面的属性。

为此,我们使用.specific属性。

所以首先我通过以下方式打开了外壳:

python manage.py shell

在那里我导入了模型和我的模型:

>>> from django.db import models
>>> from portfolio import PortfolioItem

在我模拟了当前的投资组合项目后,调用它并获得了几个属性的结果

>>> page = PortfolioItem.objects.get(title = "Project title1")
>>> page
<PortfolioItem: Project title1>
>>> page.thumbnail
<ImageFieldFile: thumb1.png>

然后我创建了“next”的实例,我在其中调用了 Wagtail 的特殊get_next_sibling()功能。如您所见,它本身不会返回记录的特定属性,而只会返回常见属性(请参阅顶部的链接)。但是使用specific属性后,您可以从记录中获取所需的所有信息。

>>> next = page.get_next_sibling()
>>> next
<Page: Project title2>
>>> next.name
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Page' object has no attribute 'name'
>>> next.specific
<PortfolioItem: Project title2>
>>> next.specific.name
'Project name2'

所以在我的模型中,我创建了新功能:

def next_port(self):
        if self.get_next_sibling():
            return self.get_next_sibling()
        else:
            return self.get_siblings().first()

在模板中我以这种方式使用它:

<img src="/media/{{ self.next_port.specific.thumbnail }}">

如果您有更优雅的方式来做同样的事情,请告诉我。


推荐阅读