0
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

我究竟做错了什么?

4

2 回答 2

2

Q 对象的语法与过滤器的语法完全相同:也就是说,您需要传递关键字和值,而不是表达式。

self.bloglist_articles.exclude(
    Q(image_link='') | Q(image_file='')
)
于 2014-10-17T12:04:10.627 回答
1

@Daniel gave you the answer, but really your entire method could be simplified to:

def get_first_article_image(self):
   q = self.bloglist_articles.exclude(image_link='', image_file='')
   if q.exists():
      return q[0]
   return None

In your template:

{% 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 %}
于 2014-10-17T12:12:27.957 回答