2011-02-03 66 views
0

它在錫說什麼:我希望能夠訪問或者:如何訪問Django模板標籤中的視圖函數?

  • 視圖功能本身
  • 視圖名稱(雖然這是用處不大,我也許可以用它來找回功能)視圖函數的
  • 屬性

這需要從一個模板標籤內訪問。

總之,我想要做的是標記視圖函數的信息,可以使用我的基本模板來配置一些視圖取景UI;例如設置標題或填充通用幫助對象。如果有人可以建議更好的方法來做到這一點,請隨時提供該答案。

回答

2

這就是模板上下文字典包含的內容。它應該包含「標題,例如,或填充通用幫助對象。」

def myViewFunction(request): 
    # whatever 
    return render_to_response(template, 
     { 'title': "Title of this view's page", 
      'help': someHelpObject, }, 
      'name': 'myViewFunction', 
      'attribute': 'some attribute of myViewFunction', 
    ) 
1

視圖函數在Django中沒有任何特殊的狀態。

模板可以在任何地方渲染:在視圖中,在模板標籤內,在模型方法中,在實用函數中......所以它甚至不清楚你想要訪問什麼。但無論如何,總的原則是,如果你想訪問模板中的某些東西,你應該將它傳遞給模板上下文。

2

是的,當你第一次實現Django時,你有時必須改變你對你的設計的看法,特別是當你來自PHP,ColdFusion或其他基於標籤的語言,其中很多功能來自從模板內。

簡而言之:不要試圖在django模板內實現任何複雜的編程邏輯。如果/ then/else和loops幾乎是你應該嘗試直接在模板中完成的複雜程度。

基本上有3種方式在模板中以編程產生輸出:

  1. 通過創建在視圖函數的內容。這通常是最常見的方法。幾乎所有查詢都將在視圖中設置(儘管它們是「lazy」,它們通常在模板內調用之前不會運行)。對象,字典,列表,元組和簡單字符串都可以在視圖中創建併發送到模板並使用Django's dot notation訪問。有些人選擇他們想要發送的變量並使用字典(通常稱爲context)發送它們。一個簡單的(儘管較少歧視)選項只是發送locals(),它將通過函數中創建的每個變量(以及參數)發送。
  2. 通過在發送給模板的對象內實現一個函數。一個例子就是你爲模型定義的一個函數。如果您爲Author型號創建了功能most_recent_posts,則可以使用{% for post in author.most_recent_posts %}
  3. 之類的功能,通過使用custom tags and templates。當需要對變量進行處理或格式化時,這通常是必需的,並且在視圖函數內執行該處理是沒有意義的。儘管過濾器(函數:接受輸入,如果你願意,可以用一個參數進行修改並返回),並且很容易開發。標籤可能更復雜。

你的目的,例如在頁面上創建一個「幫助對象」,你可能有興趣在一個特殊的被稱爲inclusion tag自定義標籤的。您將它稱爲正常自定義標記:{% show_help obj %},並且您創建了一個旨在輸出該對象數據的模板。例如,假設您想實現一個上下文相關的幫助系統,並且您只是希望它從數據庫中提取幫助對象並輸出它們。你會正是如此創建一個標籤:

from help.models import Help 
@register.inclusion_tag('/help/help.html') 
def show_help(topic): 
    help = Help.objects.get(topic__iexact=topic) 
    return { 
     'help': help 
    } 

然後你就會有一個模板,用於輸出幫助內容:

# /help/templates/help/help.html 
<div class="help-widget"> 
<h2>{{ help.title }}</h2> 
<p>{{ help.content }}</p> 
</div> 

在模板中,你會叫這個包含標籤:

<form><fieldset>Delete Project</fieldset> 
... 
{% show_help "Deleting Project" %} 
</form> 
+0

這裏唯一棘手的部分是模板的性質;有問題的幫助鏈接將在基礎模板中進行,因此我需要傳遞視圖的名稱。把它放在幾十個觀點的背景下是對屁股的痛苦;在我看來,這樣做肯定有更好的方法。 – 2011-02-03 23:33:17

0

如果你需要傳遞每次重複的上下文,並且每次寫入視圖時都要在視圖的上下文中提及。

它可以通過使用context_processors以更好的方式完成。該鏈接將爲您提供所需信息的其餘部分。如果有任何疑問,請隨時溝通。

Definition of Context Processors

相關問題