2017-01-18 13 views
0

私はデータベースにサイトをグローバルに格納したいと思います。私のインデックスビューでは、次のようなものがあります。Django - グローバルにいくつかの値を格納します

sites_inactive = Site.objects.filter(is_active=False) 
sites_all = Site.objects.all() 
context['sites_inactive'] = sites_inactive.count() 
context['sites_all'] = sites_all.count() 

私はすべてのビューでこれらの変数にアクセスしたいと思います。今私はすべてのビューで自分のコードを繰り返す必要があります。これらの値を格納し、単にそれを私のbase.htmlファイルに入れることは可能ですか?私は:

Number of sites: {{ sites_all }} 
+0

関連:http://stackoverflow.com/questions/2680902/python-django-global-variables – jarmod

答えて

-1

あなたが探しているものです。 request.session.get('num_of_sites')を使用すると、グローバルデータをセッションに格納し、すべてのビューでアクセスできます。詳細については、linkをご覧ください。

すべてのテンプレートに表示する場合は、そのためのコンテキストプロセッサを作成することをお勧めします。

+0

セッションはサイト訪問者ごとにユニークですか? – jarmod

+0

はい。セッションはユーザーごとに一意です。この状況のた​​めのより良いアプローチは、カスタムコンテキストプロセッサを書くことです。 – Darshit

3

あなたは、テンプレートにコンテキストを送信するためにRequestContextを使用する場合は、することができますwrite your own context processorコンテキストにこれらの変数を追加し、変数はすべてのテンプレートで利用できるようになります、あなたのTEMPLATES設定の「プロセッサの部分にそれを追加。

0

これを行う1つの方法は、カスタムContextMixinを使用して、すべてのビューでそれを使用することです。カスタムContextMixinget_context_data機能を拡張する必要があります。

class SiteMixin(ContextMixin): 
    def get_context_data(self, **kwargs): 
     context = super(SiteMixin, self).get_context_data(**kwargs) 
     # Edit context 
     return context 

class MyView(SiteMixin, View): 
    pass 
2

一般的に、コードをグローバルで散らすのは悪い考えです。 RemcoGerlichがすでに示唆したようにあなたはしかし、代わりにグローバルから値をフェッチする私はそれそのように作られた

def my_context_processor(request): 

    obj = cache.get('site_stats') 
    if not obj: 

     sites_inactive = Site.objects.filter(is_active=False) 
     sites_all = Site.objects.all() 
     obj = {'sites_inactive': sites_inactive.count(), 
       'sites_all']: sites_all.count()} 
     cache.set('site_stats',obj) 

    return obj 
0

、あなたがキャッシュに頼る必要があり、コンテキストプロセッサを作成する必要があります。今私はsites_allと私のアプリでどこでもsites_inactiveへのアクセスを

processor.py

def my_context_processor(request): 

    return {'sites_all': Site.objects.all().count, 
      'sites_inactive':  Site.objects.filter(is_active=False).count()} 

settings.py

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [TEMPLATE_DIR, ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
       'mainapp.processor.my_context_processor', 
      ], 
     }, 
    }, 
] 

を持っています。大丈夫ですか?

関連する問題