2011-08-11 14 views
0

私はブログのdjangoアプリケーションを持っています。ブログのエントリは、/ year/month/day/slugのURLパターンを通してアクセスできます。うまくいきます。 私の問題は、ウェブサイト上のどのテンプレートでもアクセス可能なアーカイブリストを作成したいのです。だから私は最高のソリューションを作成し、必要な情報を返すtemplatetagを作成することだと思った。django templatetagsのアーカイブリスト

私はアーカイブの形式は以下のようなことがしたかった:

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

だからだけで、現在の年のために数ヶ月を示しています。

これは私が思い付いたタグである:あなたが名前とURLを含む、タプルのリストを返すイムを見ることができるように

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]) 

。 これは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 %} 

また、コードにリンクをハードコードしないことをおすすめします。 URL解決者についてはhttps://docs.djangoproject.com/en/dev/topics/http/urls/を、次に{%url%}テンプレートタグについてはhttps://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#urlを読んでください。あなたはURLに名前をつけることができ、後でコード内でハードコーディングすることなく、あなたが望むものにURLを得ることができます。これは将来的に助けになるでしょう;)

+0

あなたの返信ありがとう、助けてくれた:)リンクは素晴らしい読書だった。あなたが提案したように終わり、タイトル、年、月のdictを返します。次に、このようなURLを取得します。{%url EntryByMonth link.year link.month%} – mXed

+0

助けられたと聞いてうれしいです! –

関連する問題