g:获取同级属性

时间:2018-08-12 19:13:32

标签: python django django-queryset wagtail

我正在创建投资组合应用程序。在内部页面上,我想提供带有缩略图的下一个投资组合记录的链接。

Wagtail: Get previous or next sibling-这是有关如何获取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

我得到的只是一个错误“页面对象没有属性'缩略图'”。但是有。这就是我的模型的样子:

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()

获取同级属性应该是显而易见的方法。你能指出我怎么做吗?

1 个答案:

答案 0 :(得分:3)

因此,此问题的答案如下。 名为@gasman的用户在这里回答:Wagtail unit testing: Adding child pages converts them to base type关于如何获取特定页面的属性。

为此,我们使用.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>

然后,我创建了“下一个”的实例,在该实例中,我将其称为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 }}">

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