2011-08-11 26 views
0

我有一個django應用程序,一個博客。博客的條目可以通過/年/月/日/ slu url網址模式訪問,它工作正常。 我的問題是,我想讓我的網站上的任何模板都可以訪問存檔列表。所以我認爲最好的解決方案是創建一個模板標籤,它可以創建並返回我需要的信息。django歸檔列表templatetags

我想要的檔案格式是這樣:

August 2011 
July 2011 
etc.. 
2010 
2009 
2008 
etc.. 

本年度所以只顯示個月。

這是我想出了一個標籤:

from django.template import Library, Node, TemplateSyntaxError 
from core.blog.models import Entry 
import datetime, calendar 

register = Library() 

class ArchiveNode(Node): 
    def __init__(self, varname): 
     self.varname = varname 

    def render(self, context): 
     temp = list() 

     #Get Info about the first post 
     first = Entry.objects.order_by("pub_date")[0] 
     first_year = first.pub_date.year 
     first_month = first.pub_date.month 

     #Loop over years and months since first post was created 
     today = datetime.datetime.today() 
     this_year = today.year 
     this_month = today.month 

     for year in range(this_year - first_year): 
      if year != this_year: 
       temp += (year,'/blog/'+year+'/') 
      else: 
       for month in range(this_month - first_month): 
        month_name = calendar.month_name[month] 
        temp += (month_name+" "+year,'/blog/'+year+'/'+month+'/') 
     context[self.varname] = temp.reverse() 
     return '' 

@register.tag 
def get_archive(parser, token): 
    bits = token.contents.split() 
    if len(bits) != 3: 
     raise TemplateSyntaxError, "get_archive tag takes exactly 1 argument" 
    if bits[1] != 'as': 
     raise TemplateSyntaxError, "second argument to get_archive tag must be 'as'" 
    return ArchiveNode(bits[2]) 

正如你可以看到即時返回一個元組列表,包含名稱和URL。 這將在django中有效嗎?或者我需要將信息打包到一些django容器中? (它似乎沒有任何回報)

這是我正在研究的網站ctrl-dev.com/blog。 檔案將位於右下角的綠色框中。

回答

0

有沒有必要返回一些特殊的東西。 Django只是Python,所以它是你想要返回的選擇。在這種情況下,我會建議返回這樣的字典(只是發明){{'title':'some title if you want','year': 'year if you want', 'url': url}, {...}, ...}。然後在模板中,你只需運行如下:

{% for entry in returned_dict %} 
    <a href="{{ entry.url }}">{{ entry.title }}</a> 
{% endfor %} 

另外,我會建議不要硬編碼鏈接到代碼。閱讀https://docs.djangoproject.com/en/dev/topics/http/urls/關於url解析器,然後https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#url關於{%url%}模板標記。您可以命名這些網址,然後您可以在不需要在代碼中對其進行硬編碼的情況下獲取所需的網址。這將有助於未來;)

希望有所幫助。

+0

感謝您的回覆,幫助很多:)鏈接是偉大的閱讀,是有道理的。按照你的建議結束,返回一個標題,年份,月份的字典。然後檢索這樣的網址{%url EntryByMonth link.year link.month%} – mXed

+0

很高興聽到它的幫助! –