2011-07-11 8 views
5

Aşağıdaki Django şablon içerik işlemci sorununa girdim.Bu Django şablonu içerik işlemcisi neden tüm istekler için geçerli değil?

bağlam işlemci myapp/context_processors.py tanımlanır: Bu standart Django bağlam işlemciler ile birlikte settings.py kadar kablolu

def my_context_processor(request): 
    return { 
     'foo': 123, 
    } 

:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'myproject.myapp.context_processors.my_context_processor', 
) 

Ben karşılaşmak ediyorum sorun olduğunu my_context_processor tüm istekler için geçerli değildir.

O şu kodu uygulanmaz:

def index(request): 
    return render_to_response("index.html", locals()) 

Ancak aşağıdaki kodu için uygulanır:

def index(request): 
    return render_to_response("index.html", locals(), context_instance=RequestContext(request)) 

O bağlam işlemciler vardır izlenimi altında oldu TÜM isteklerde, sadece context_instance sağlandığında değil.

İçerik işlemcilerimin TÜM istekleri için nasıl uygulanmasını sağlarım?

cevap

11

Kendi sorunuza cevap verdiniz. RequestContext'u kullanan yanıtlara uygulanır. Yapmayanlara uygulanmaz.

Tüm yanıtlara uygulanabilmenin yolu, her zaman RequestContext kullandığınızdan emin olmaktır. Veya, Django 1.3+ sürümünde, sizin için bir RequestContext oluşturan render_to_response yerine render kısayolunu kullanabilirsiniz.

0

İçerik işlemci değişkenleri yalnızca olarak şablona RequestContext nesnesi (geçerli istekle başlatılan) gönderilirken kullanılabilir.

+1

İçerik_instance boilerplate'i önlemek için kullanabileceğim herhangi bir DRY kısayolu var mı? Oldukça yaygın bir senaryonun, içerik işlemci değişkenlerinin tüm istekler için mevcut olmasını isteyeceğiniz varsayımıdır. Tüm görünümlerin "linked_sites" listesine ihtiyacı olan bir altbilgi içerdiğini varsayalım. "linked_sites" bir içerik işlemcisi tarafından sağlanacaktır, ancak kodumun context_instance = RequestContext (request) :-) ile serpilmesinden kaçınmak istiyorum – knorv

3

Django otomatik Sen Django docs bu konuda okuyabilir RequestContext

from django.shortcuts import render 

def my_view(request): 
    # View code here... 
    context = { 
     'some_extra_var_for_template': 'value' 
    } 
    return render(request, 'myapp/index.html', context) 

içerir Django 1.3 yeni render kısayol tanıtıldı.

İlgili konular