Django'nun sınıf tabanlı genel görünümlerini özelleştirerek güçlü ve verimli web geliştirme rehberi. Görünümleri özel ihtiyaçlarınıza göre nasıl uyarlayacağınızı öğrenin.
Django Sınıf Tabanlı Görünümler: Genel Görünüm Özelleştirmelerinde Uzmanlaşma
Django'nun sınıf tabanlı görünümleri (CBV'ler), web uygulamaları oluşturmak için güçlü ve yeniden kullanılabilir bir yol sunar. CBV'lerin bir alt kümesi olan genel görünümler, liste görüntüleme, detay görünümleri, nesne oluşturma, güncelleme ve silme gibi yaygın görevler için önceden oluşturulmuş çözümler sunar. Bu genel görünümler inanılmaz derecede kullanışlı olsa da, uygulamanızın özel ihtiyaçlarına tam olarak uyum sağlamak için genellikle özelleştirme gerektirirler. Bu kapsamlı rehber, verimli ve bakımı kolay web uygulamaları oluşturmanızı sağlayarak, Django'nun genel görünümlerini özelleştirmek için çeşitli teknikleri ele almaktadır.
Django'nun Sınıf Tabanlı Görünümlerini Anlamak
Özelleştirmeye dalmadan önce, CBV'lerin ve genel görünümlerin temellerini özetleyelim. Geleneksel fonksiyon tabanlı görünümler (FBV'ler), HTTP isteklerini doğrudan tek bir fonksiyon içinde işler. Buna karşılık, CBV'ler görünüm mantığını sınıflara ayırarak daha yapılandırılmış ve nesne yönelimli bir yaklaşım sunar. Bu, daha iyi kod organizasyonu, yeniden kullanılabilirlik ve test edilebilirliğe yol açar.
Genel görünümler, yaygın web geliştirme görevlerini yerine getirmek üzere tasarlanmış önceden oluşturulmuş CBV'lerdir. View
ve TemplateView
gibi temel sınıflardan miras alırlar ve özel işlevsellikler sunarlar. Yaygın genel görünümler şunları içerir:
ListView
: Nesnelerin bir listesini görüntüler.DetailView
: Tek bir nesnenin ayrıntılarını görüntüler.CreateView
: Bir form kullanarak nesne oluşturmayı işler.UpdateView
: Bir form kullanarak nesne güncellemeyi işler.DeleteView
: Nesne silmeyi işler.
Bu genel görünümler sağlam bir temel sunar, ancak gerçek dünya uygulamaları genellikle davranışlarını uyarlamayı gerektirir. Çeşitli özelleştirme tekniklerini inceleyelim.
Özelleştirme Teknikleri
Django'nun genel görünümlerini özelleştirmenin, basit özellik geçersizleştirmelerinden daha karmaşık yöntem geçersizleştirmelerine kadar çeşitli yolları vardır. Uygun teknik, gereken özelleştirme düzeyine bağlıdır.
1. Özellik (Attribute) Geçersizleştirme
Özelleştirmenin en basit şekli, genel görünüm sınıfının özelliklerini geçersizleştirmeyi içerir. Bu, model, şablon adı veya bağlam nesnesi adı gibi temel özellikleri değiştirmek için idealdir.
Örnek: ListView
'ı Özelleştirme
Bir makale listesi görüntülemek istediğinizi, ancak özel bir şablon ve farklı bir bağlam nesnesi adı kullanmak istediğinizi varsayalım.
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(is_published=True).order_by('-publication_date')
Bu örnekte, model
, template_name
ve context_object_name
özelliklerini geçersizleştirdik. Ayrıca, makaleleri filtrelemek ve yayın tarihlerine göre sıralamak için get_queryset
yöntemini geçersizleştirdik. get_queryset
yöntemi, liste görünümüne hangi nesnelerin dahil edileceği üzerinde kontrol sağlar. Bu, filtreleme, sıralama ve sayfalama uygulamak için kullanışlıdır.
2. Yöntem (Method) Geçersizleştirme
Yöntem geçersizleştirme, genel görünüm sınıfındaki mevcut yöntemlerin davranışını değiştirmenize olanak tanır. Bu, görünümün mantığı üzerinde daha fazla kontrol sağlar. Geçersizleştirilecek yaygın yöntemler şunlardır:
get_queryset()
: Görünüm tarafından kullanılan sorgu kümesini kontrol eder.get_context_data()
: Şablon bağlamına veri ekler.form_valid()
: Başarılı form gönderimini işler.form_invalid()
: Geçersiz form gönderimini işler.get_success_url()
: Başarılı form gönderiminden sonra yönlendirilecek URL'yi belirler.get_object()
: DetailView, UpdateView ve DeleteView için nesneyi alır
Örnek: DetailView
'ı Özelleştirme
Bir makalenin ayrıntılarını görüntülemek istediğinizi, ancak ilgili yorumları da şablon bağlamına dahil etmek istediğinizi varsayalım.
from django.views.generic import DetailView
from .models import Article, Comment
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(article=self.object, is_approved=True)
return context
Burada, şablon bağlamına bir comments
değişkeni eklemek için get_context_data()
yöntemini geçersizleştirdik. Bu, article_detail.html
şablonunda ilgili yorumları kolayca erişmenize ve görüntülemenize olanak tanır.
3. Mixin Kullanımı
Mixin'ler, belirli işlevsellik sağlayan yeniden kullanılabilir sınıflardır. Görünümün temel mantığını değiştirmeden özellikler eklemek için genel görünümlerle birleştirilebilirler. Django birkaç yerleşik mixin sağlar ve kendi mixin'lerinizi de oluşturabilirsiniz.
Örnek: LoginRequiredMixin
Kullanımı
LoginRequiredMixin
, yalnızca oturum açmış kullanıcıların belirli bir görünüme erişebilmesini sağlar.
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # İstediğiniz başarı URL'si ile değiştirin
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Bu örnekte, ArticleCreateView
'a erişimi yalnızca oturum açmış kullanıcılara kısıtlamak için LoginRequiredMixin
kullandık. Ayrıca, makalenin yazarını otomatik olarak geçerli kullanıcı olarak ayarlamak için form_valid
yöntemini geçersizleştirdik. Bu, karmaşık özelleştirme elde etmek için mixin'lerin yöntem geçersizleştirme ile nasıl birleştirilebileceğini göstermektedir.
Özel Mixin'ler Oluşturma
Yeniden kullanılabilir mantığı kapsüllemek için kendi mixin'lerinizi de oluşturabilirsiniz. Örneğin, geçerli kullanıcıyı bir model örneğinin yazarı olarak otomatik olarak ayarlayan bir mixin veya izin kontrollerini ele alan bir mixin oluşturabilirsiniz.
from django.contrib.auth.mixins import UserPassesTestMixin
class AuthorRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff or (self.request.user == self.get_object().author)
def handle_no_permission(self):
# İstediğiniz yönlendirme veya hata işleme ile değiştirin
return redirect('permission_denied') # Veya bir istisna yükseltin
Bu AuthorRequiredMixin
, yalnızca personel üyelerine veya nesnenin yazarına erişim izni verir. Yetkili kullanıcıların nesneleri değiştirmesini veya silmesini sağlamak için bunu UpdateView
veya DeleteView
ile kullanabilirsiniz.
4. Şablon Özelleştirmesi
Yukarıdaki teknikler görünüm mantığını değiştirmeye odaklanırken, şablon özelleştirmesi verilerin sunumunu kontrol etmek için kritik öneme sahiptir. Genel görünümler HTML çıktısını oluşturmak için şablonlar kullanır. Uygulamanızın tasarımına ve markasına uyacak şekilde bu şablonları özelleştirebilirsiniz.
Şablon Adlandırma Kuralları
Genel görünümler belirli şablon adlandırma kurallarını izler. Örneğin:
ListView
:<uygulama_adı>/<model_adı>_list.html
(örneğin,articles/article_list.html
)DetailView
:<uygulama_adı>/<model_adı>_detail.html
(örneğin,articles/article_detail.html
)CreateView
/UpdateView
:<uygulama_adı>/<model_adı>_form.html
(örneğin,articles/article_form.html
)DeleteView
:<uygulama_adı>/<model_adı>_confirm_delete.html
(örneğin,articles/article_confirm_delete.html
)
Farklı bir şablon kullanmak için görünüm sınıfındaki template_name
özelliğini geçersizleştirebilirsiniz. Şablon içinde, bağlam nesnesi aracılığıyla görünüm tarafından sağlanan verilere erişebilirsiniz. Varsayılan bağlam nesnesi adı genellikle model adının küçük harfli halidir (örneğin, Article
için article
). Bunu context_object_name
özelliğini kullanarak değiştirebilirsiniz.
Örnek: ListView
Şablonunu Özelleştirme
articles/article_list.html
şablonunda, makale listesini görüntülemek için articles
bağlam değişkeni (yukarıdaki ArticleListView
örneğinde tanımlandığı gibi) üzerinde döngü yapabilirsiniz.
<h1>Makaleler</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. Form Özelleştirmesi (CreateView & UpdateView)
CreateView
ve UpdateView
, kullanıcı girişini işlemek için Django formlarına güvenir. Bu formları özelleştirmek, görüntülenen alanları, doğrulama kurallarını ve görünümlerini kontrol etmenize olanak tanır.
form_class
Kullanımı
Görünüm sınıfındaki form_class
özelliği ile kullanılacak form sınıfını belirtebilirsiniz. Bir form sınıfı belirtmezseniz, Django otomatik olarak görünümle ilişkili modele dayalı bir ModelForm
oluşturacaktır.
Form Yöntemlerini Geçersizleştirme
Formun davranışını özelleştirmek için form sınıfınızdaki yöntemleri geçersizleştirebilirsiniz. Geçersizleştirilecek yaygın yöntemler şunlardır:
__init__()
: Formu başlatın ve alanlarını değiştirin.clean()
: Birden çok alan arasında özel doğrulama gerçekleştirin.clean_<alan_adı>()
: Belirli bir alan için özel doğrulama gerçekleştirin.
Örnek: Makale Formunu Özelleştirme
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['content'].widget = forms.Textarea(attrs={'rows': 5})
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Başlık en az 5 karakter uzunluğunda olmalıdır.")
return title
Bu örnekte, Meta
sınıfındaki fields
özelliğini formda hangi alanların yer alacağını belirterek ArticleForm
'u özelleştirdik. Ayrıca, content
alanının widget'ını özelleştirmek için __init__()
yöntemini ve title
alanı için özel doğrulama eklemek üzere clean_title()
yöntemini geçersizleştirdik.
6. Dinamik Form İşleme
Bazen formu kullanıcıya veya diğer faktörlere göre dinamik olarak ayarlamanız gerekir. Bunu, görünüm sınıfındaki get_form_kwargs()
yöntemini geçersizleştirerek başarabilirsiniz. Bu yöntem, formun oluşturucusuna ek anahtar kelime argümanları geçirmenize olanak tanır.
Örnek: Kullanıcıyı Forma Gönderme
from django.views.generic import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # İstediğiniz başarı URL'si ile değiştirin
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Ardından, ArticleForm
'unuzda, __init__()
yöntemindeki user
anahtar kelime argümanı aracılığıyla kullanıcıya erişebilirsiniz.
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if self.user and not self.user.is_staff:
del self.fields['is_published'] # Yalnızca personel yayınlayabilir
Bu örnekte, geçerli kullanıcıyı forma iletiyor ve kullanıcının personel üyesi olmaması durumunda is_published
alanını dinamik olarak kaldırıyoruz. Bu, kullanıcının izinlerine göre formu dinamik olarak nasıl ayarlayabileceğinizi gösterir.
Gelişmiş Özelleştirme: Viewset Kullanımı
Daha karmaşık uygulamalar, özellikle API'leri içerenler için Django REST Framework'ün (DRF) Viewset'lerini düşünün. Viewset'ler, ilgili görünümleri (örneğin, liste, oluşturma, alma, güncelleme, silme) tek bir sınıfta birleştirerek API uç noktalarını yönetmek için daha temiz ve daha organize bir yol sunar.
Örnek: Bir ArticleViewSet Oluşturma
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
Bu basit ArticleViewSet
, makaleler için tüm standart CRUD (Oluştur, Oku, Güncelle, Sil) işlemlerini sağlar. Genişletme yöntemleri gibi genel görünümlere benzer teknikleri kullanarak Viewset'leri özelleştirebilirsiniz.get_queryset()
, perform_create()
ve perform_update()
.
Genel Görünüm Özelleştirmesi İçin Küresel Hususlar
Genel görünümleri küresel bir kitle için özelleştirirken aşağıdaki hususları göz önünde bulundurun:
- Yerelleştirme ve Uluslararasılaştırma (L10n/I18n): Şablonlarınızın ve formlarınızın birden çok dili ve bölgesel biçimi desteklediğinden emin olun. Django'nun yerleşik i18n/l10n özelliklerini kullanın.
- Saat Dilimleri: Tarih ve saatleri kullanıcının yerel saatinde görüntülemek için saat dilimi dönüşümlerini doğru bir şekilde ele alın. Django'nun
timezone
modülünü kullanın. - Para Birimi Biçimlendirmesi: Farklı bölgeler için para birimi değerlerini uygun şekilde biçimlendirin. Para birimi biçimlendirmesi için
babel
gibi bir kütüphane düşünün. - Tarih ve Sayı Biçimlendirmesi: Kullanıcının yerel ayarlarına göre uygun tarih ve sayı biçimlerini kullanın.
- Erişilebilirlik: Özelleştirilmiş görünümlerinizin ve şablonlarınızın engelli kullanıcılar için erişilebilir olduğundan emin olun. WCAG gibi erişilebilirlik yönergelerini izleyin.
- Duyarlı Tasarım: Şablonlarınızın duyarlı olduğundan ve dünya genelindeki kullanıcılar tarafından kullanılan farklı ekran boyutlarına ve cihazlara uyum sağladığından emin olun.
- Kültürel Hassasiyet: Görünümlerinizi ve şablonlarınızı tasarlarken kültürel farklılıklara dikkat edin. Belirli kültürler için saldırgan olabilecek görseller veya dil kullanmaktan kaçının. Örneğin, renk çağrışımları ve semboller kültürler arasında çok farklı anlamlara gelebilir.
Örnek: Saat Dilimlerini Ele Alma
Bir yayın tarihini kullanıcının yerel saat diliminde görüntülemek için şablonunuzdaki timezone
etiketini kullanabilirsiniz:
{% load tz %}
<p>Yayınlandı: {% timezone article.publication_date %}</p>
Django ayarlar dosyanızda USE_TZ = True
olduğundan emin olun.
Genel Görünüm Özelleştirmesi İçin En İyi Uygulamalar
Özelleştirmelerinizin sürdürülebilir ve verimli olmasını sağlamak için şu en iyi uygulamaları izleyin:
- Basit Tutun: Özelleştirmelerinizi aşırı karmaşık hale getirmekten kaçının. İstenen sonucu elde eden en basit tekniği kullanın.
- Kodunuzu Belgeleyin: Özelleştirmelerinizi ve neden gerekli olduklarını açıklamak için yorumlar ekleyin.
- Kapsamlı Test Edin: Özelleştirmelerinizin doğru çalıştığından emin olmak için birim testleri yazın.
- Mixin'leri Akıllıca Kullanın: Yaygın işlevselliği kapsüllemek için yeniden kullanılabilir mixin'ler oluşturun.
- Django'nun Kurallarına Uyun: Django'nun kodlama stiline ve adlandırma kurallarına uyun.
- Güvenliği Düşünün: Görünümleri özelleştirirken potansiyel güvenlik açıklarının farkında olun. Kullanıcı girişini temizleyin ve Siteler Arası Komut Dosyası Oluşturma (XSS) ve SQL Enjeksiyonu gibi yaygın saldırılara karşı koruma sağlayın.
Sonuç
Django'nun sınıf tabanlı genel görünümleri, web uygulamaları oluşturmak için güçlü ve esnek bir yol sunar. Bu rehberde özetlenen özelleştirme tekniklerinde uzmanlaşarak, genel görünümleri özel ihtiyaçlarınıza göre uyarlayabilir, verimli, bakımı kolay ve küresel olarak erişilebilir web uygulamaları oluşturabilirsiniz. Basit özellik geçersizleştirmelerinden karmaşık yöntem geçersizleştirmelerine ve mixin kullanımına kadar olanaklar geniştir. Uygulamalarınızın farklı uluslararası kitlelere hitap etmesini sağlamak için küresel bakış açılarını ve en iyi uygulamaları göz önünde bulundurmayı unutmayın.