2014-10-17 18 views
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) 

,如果我在模板調用諸如NameError而用品質對象模型中的方法

<a href="{{ bloglist_obj.get_first_article_image }}">{{bloglist.title}}</a> 

我越來越

NameError at/
global name 'image_link' is not defined 

我究竟做錯了什麼?

+0

什麼觀點給出這樣的錯誤? – 2014-10-17 11:56:12

+0

@BurhanKhalid我在模板中調用它,請參閱我的更新 – doniyor 2014-10-17 12:00:33

+0

什麼是確切的錯誤行,因爲'bloglist.image_file'將不起作用 - 過濾器返回一個列表而不是對象。 – 2014-10-17 12:02:54

回答

1

Q對象的語法與過濾器的語法完全相同:也就是說,您需要傳遞關鍵字和值,而不是表達式。

self.bloglist_articles.exclude(
    Q(image_link='') | Q(image_file='') 
) 
+0

所以''=''而不是''='''對嗎? – doniyor 2014-10-17 12:06:33

+0

並排除代替過濾器。關鍵是'image_link!='「'是一個表達式,它是以變量」image_link「的存在爲前提的,而'image_link =」「'是(在這種情況下)具有值」「的關鍵字參數。 – 2014-10-17 12:12:40

+0

感謝它的伎倆,沒有關於此。 – doniyor 2014-10-17 12:17:47

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 %} 
+0

哇,很乾淨。非常感謝。我真的需要學會乾淨地編碼 – doniyor 2014-10-17 12:17:30

相關問題