我正在创建投资组合应用程序。在内部页面上,我想提供带有缩略图的下一个投资组合记录的链接。
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()
获取同级属性应该是显而易见的方法。你能指出我怎么做吗?
答案 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 }}">
如果您有更优雅的方式来做同样的事情,请告诉我。