2011-01-29 12 views
0

ベーステンプレートにランダムスローガンを追加したいと思います。私はこれを行う簡単な方法は、私のスローガンでdbテーブルを持って、ランダムなものを取得し、それをテンプレートに渡すことです。djangoテンプレートがインクルードファイルからランダム行を取得する最適な方法

質問は、データベースを使用せずにどうすればよいですか?私の基本テンプレートでは、各行に1つのスローガンを含むファイルを含め、そのテンプレートにランダムに1つを選択させたいと考えています。私はrandomフィルタがリストからランダムな値を選ぶことを知っているので、何とか、私はincludeスローガンファイルにする必要がありますが、リストとして。私が見る

+0

データベース上でフラットファイルを使用する特別な理由はありますか? – KyleWpppd

+0

スローガンはめったに変わらず、少数しかありません。 dbキャッシングを使用しても、すべてのページヘッダーに文を挿入するために、個別のアプリケーションを作成して維持する(または無関係な既存のアプリケーションを「ダーティ」にする)必要はないようです。私にとって、論理的な場所は私の 'header.html'テンプレートの' base.html'テンプレートに含まれているはずです。 – gorus

+0

私は、スローガンをランダムに選択する機能があれば、フラットファイルを使用するよりも、データベースの方がはるかに効率的であると考えています。私はdbへの呼び出しをキャッシュすることができますが、あなたのスローガンへの呼び出しができます知っている? – KyleWpppd

答えて

0

つのオプション:

1)は、コンテキストに挿入し、すなわち、フラット・ファイルからこのランダム引用()をロードするためにコンテキストプロセッサを使用します。例:

# create your own context-processor file (myutils/context_processors.py) 
def my_random_quote_processor(request): 
    context = {} 

    # generate your string you want in template 
    # .... 
    context['RANDOM_QUOTE'] = my_random_quote 

    return context 


# in settings.py, tell django to include your processor 
TEMPLATE_CONTEXT_PROCESSORS = (
    # ..., 
    'myutils.context_processors.my_random_quote_processor' 
) 


# in your base template, just include the template var 
<p>quote: {{ RANDOM_QUOTE }}</p> 


# make sure in your views, you set the context_instance 
def my_view(request): 
    # ... 
    return render_to_response('myapp/mytemplate.html', c, 
           context_instance=RequestContext(request)) 

2)など、あなたがフラット・ファイルからの引用をロードするカスタムテンプレートタグを作成します。:http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

+0

ありがとう! (1):私は 'header.inc'にスローガンを入れたいので、すべてのページで、別のコンテキストを渡している異なるビューを持っているので、このルートを複雑にするので、余分な変数を含まないことを望んでいました。 (2)の場合:Loarfatronへの私の返事を参照してください - これは良い方法がない場合に行く方法だと思います。 – gorus

+0

オリジナルの投稿を更新して上の#1の上でellaborateにします –

0

私はテンプレートタグのために投票します。ランダムな見積もりをテキストファイルに格納し、各見積もりを別々の行に格納します。次に、ランダムに行を読み込んだテンプレートタグで、ここでそれを行う方法の素晴らしい説明: http://www.regexprn.com/2008/11/read-random-line-in-large-file-in.html。 は、以下に再現:

import os,random 

filename="averylargefile" file = 
open(filename,'r') 

#Get the total file size file_size = os.stat(filename)[6] 

while 1: 
    #Seek to a place in the file which is a random distance away 
    #Mod by file size so that it wraps around to the beginning 
    file.seek((file.tell()+random.randint(0,file_size-1))%file_size) 

    #dont use the first readline since it may fall in the middle of a line 
    file.readline() 
    #this will return the next (complete) line from the file 
    line = file.readline() 

    #here is your random line in the file 
    print line 

テンプレートタグは、それをプリントアウトすることができますので、最後の行を返します。

+0

ありがとう、これはファイルから手作業で読むというこの方法を使用するとうまくいくようです。しかし、これは本当に "djangoの背後にある"のように思えます:)もし私が "ジャンゴのやり方"をする方法がないなら、おそらく 'include'タグで何か特別なことをすることによって、これはやり方だと思います。 – gorus

+0

うーん、もっとジャンゴー的なやり方がわからない。好奇心のためになぜあなたはスローガンをDBから守りたいのですか?これをデータベースに置くと、管理者が簡単にスローガンを更新/追加できるようになります。 – joshcartme

0

スローガンのベースがかなり小さい場合は、ピクルスモジュールを使用できます。 そして、通常のリストのようにベースを操作してください。 http://docs.python.org/library/pickle.html

しかし、私は最善の解決策は、実際のDBに

+0

あなたはもっと具体的になりますか?テンプレートからピクルスを使用するには?私はまだpickledリストをテンプレートに渡さなければならないように思えます。その時点で、私は普通のリストを渡して、 'random'フィルタを使うことができます。 – gorus

関連する問題