class BlogList(models.Model):
title = models.CharField(max_length=100)
def get_first_article_image(self):
if self.bloglist_articles.exists():
bloglist = self.bloglist_articles.filter(
Q(image_link != '') | Q(image_file != '') ##<---error line
).order_by('-id')[:1].get()
if bloglist.image_file:
return '/'.join([settings.MEDIA_URL, bloglist.image_file.name])
if bloglist.image_link:
return bloglist.image_link
return None
class BlogArticle(models.Model):
bloglist = models.ForeignKey(BlogList, related_name='bloglist_articles')
image_file = models.ImageField(upload_to='image/', default='', blank=True)
image_link = models.CharField(max_length=2000, blank=True)
image_embed = models.CharField(max_length=2000, blank=True)
如果我在模板中调用
<a href="{{ bloglist_obj.get_first_article_image }}">{{bloglist.title}}</a>
我正在
NameError at /
global name 'image_link' is not defined
我做错了什么?
答案 0 :(得分:1)
Q对象的语法与过滤器的语法完全相同:也就是说,您需要传递关键字和值,而不是表达式。
self.bloglist_articles.exclude(
Q(image_link='') | Q(image_file='')
)
答案 1 :(得分:1)
@Daniel给了你答案,但实际上你的整个方法可以简化为:
def get_first_article_image(self):
q = self.bloglist_articles.exclude(image_link='', image_file='')
if q.exists():
return q[0]
return None
在你的模板中:
{% if bloglist_obj.get_first_article_image %}
<a href="{{ bloglist_obj.get_first_article_image.image_link }}">
<img src="{{ bloglist_obj.get_first_article_image.image_file.url }}">
</a>
{% endif %}