Django Context Processor (Ortak Nesne - Fonksiyon Oluşturma)
Kısaca Nedir Bu Context Processor?
Django’da bir proje oluştururken, sürekli kullandığınız sorgu, nesne yada fonksiyonu uygulamanızı oluşturan tüm view’larda
tekrar yazmaktansa context_processor.py
içerisinde yazıp tüm template’de rahatça kullanabilirsiniz.
Örneğin bir web uygulaması yaptığınızı ve web uygulamasının her sayfasında sabit olarak bir kategori/menu barındırdığını varsayarsak, kategorilerin isimlerini ve id’lerini çekmek için her viewe kategorileri çekmek için sorgu eklemek yerine context_processor.py içerisine ekleyerek projemizin tüm template dosyalarında bu kategori bilgilerini çekebiliriz.
Nasıl Mı?
İlk olarak django projenizin ana uygulama dizininde bulunan context_processor.py dosyasını açalım (Yoksa aynı isimde oluşturabilirsiniz.) Sonra aşağıdaki yapıya benzer bir yapı oluşturun:
from models import kategori
def kategoriler(request):
return {
"kategoriler":kategori.objects.all(),
}
Ardından bu eklediğimiz fonksiyonu uygulamamızın ayar dosyası olan settings.py içerisinde belirtmemiz gerekiyor. TEMPLATES değişkeninin olduğu satırı bulun.
Default olarak sizi aşağıdaki gibi bir yapı karşılayacaktır. Buraya options»context_processor içerisine uygulamaAdiniz.context_processor.kategoriler
eklemeniz yeterli olacaktır.
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [str(BASE_DIR / "templates")],
"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",
],
},
},
]
Ekledikten sonra Şöyle bir görüntü elde edeceksiniz:
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [str(BASE_DIR / "templates")],
"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",
'uygulamaAdiniz.context_processors.kategoriler',
],
},
},
]
Artık projenizin heryerinde {{ kategoriler }}
i kullanabileceksiniz. Örneğin;
{% for kategori in kategoriler %}
<a href="/kategori/{{kategori.id}}">{{kategori.kategori_adi}}
{% endfor %}