2010-10-18 79 views
1

嘿,它是一個星期的Django回到這裏,所以我不介意,如果這個問題是愚蠢的,但我在搜索計算器和沒有運氣谷歌。Django模板分辨率可變

我有一個叫Term的簡單模型(試圖爲我的新聞模塊實現標籤和類別),我有一個名爲taxonomy_list的模板標籤,它應該輸出分配給一個文章的所有術語,用逗號分隔鏈接。現在,我的術語模型沒有永久鏈接字段,但它從我的視圖中獲取並傳遞給模板。模板內的永久鏈接值看起來很好,但不會加載到我的模板標籤中。

爲了說明這一點我有位從我的代碼。這就是所謂的taxonomy_list我的自定義模板標籤:

from django import template 
from juice.taxonomy.models import Term 
from juice.news.models import Post 

register = template.Library() 

@register.tag 
def taxonomy_list(parser, token): 
    tag_name, terms = token.split_contents() 
    return TaxonomyNode(terms) 

class TaxonomyNode(template.Node): 
    def __init__(self, terms): 
     self.terms = template.Variable(terms) 
    def render(self, context): 
     terms = self.terms.resolve(context) 
     links = [] 

     for term in terms.all(): 
      links.append('<a href="%s">%s</a>' % (term.permalink, term.name)) 

     return ", ".join(links) 

這裏是我的單篇文章的觀點:

# single post view 
def single(request, post_slug): 
    p = Post.objects.get(slug=post_slug) 
    p.tags = p.terms.filter(taxonomy='tag') 
    p.categories = p.terms.filter(taxonomy='category') 

    # set the permalinks 
    for c in p.categories: 
     c.permalink = make_permalink(c) 
    for t in p.tags: 
     t.permalink = make_permalink(t) 

    return render_to_response('news-single.html', {'post': p}) 

這是我做我的模板中,說明訪問的類別有兩種方法:

Method1: {% taxonomy_list post.categories %} 
Method2: {% for c in post.categories %}{{c.slug}} ({{c.permalink}}),{% endfor %} 

有趣的是,方法2號工作正常,但方法1號說,我.permalink場是不確定的,這可能意味着,可變分辨率不這樣做一我期待,因爲「額外」永久鏈接字段被排除在外。

我想,也許該變量是不承認的領域,因爲它未在模型中定義的,所以我嘗試爲其分配模型內的「臨時」值,但這並沒有幫助。方法1在鏈接中包含「臨時」,而方法2正常工作。

任何想法?

謝謝!

回答

2

這不是真的可變分辨率的問題。問題在於您如何從Post對象獲取條款。

在模板標籤中,當您做for term in terms.all()時,all告訴Django重新評估查詢集,這意味着再次查詢數據庫。因此,用數據庫中的新對象刷新了經過仔細標註的術語,並且permalink屬性被覆蓋。

它可能會工作,如果你剛落all - 所以你只要for term in terms:。這將重新使用現有的對象。

+0

啊,我們走了。我知道我錯過了一些東西。非常感謝丹尼爾! – kovshenin 2010-10-18 11:08:48