ÖZETLE:
Genel Görünümleri Genişletmek-Geliştirmek (EXTENDING GENERIC VIEWS)
Genel görünümler kullanmanın geliştirmeyi önemli ölçüde hızlandırabileceğine şüphe yok. Ancak çoğu projede, genel görüşlerin artık yeterli olmadığı bir an gelir. Aslında, yeni Django geliştiricileri tarafından sorulan en yaygın soru, genel görünümlerin daha geniş bir dizi durumu nasıl ele alacağıdır.
Bazı üçüncü taraf uygulamalardan genel görünüm(generic view) örneği mevcuttur faydalanabilir veya kendi görünümünüzü yazabilirsiniz.
Nesnelerin genel görünümü(Generic views of objects)
TemplateView kesinlikle kullanışlıdır, ancak Django’nun genel görünümleri(generic views) veritabanı içeriğinizin görünümlerini sunmaya gelince gerçekten parlar. Bu çok yaygın bir görev olduğu için, Django, nesnelerin liste halinde(ListViews) veya ayrıntılı(DetailViews) görünümlerini oluşturmaya yardımcı olacak bir avuç yerleşik genel görünümle birlikte gelir.Önce kullanacağımız modelleri(models) görelim:
# models.py from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: ordering = ["-name"] def __str__(self): return self.name class Author(models.Model): salutation = models.CharField(max_length=10) name = models.CharField(max_length=200) email = models.EmailField() headshot = models.ImageField(upload_to='author_headshots') def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField('Author') publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) publication_date = models.DateField()
Modelden sonra şimdi görünümleri(views) yazalım:
# views.py from django.views.generic import ListView from books.models import Publisher class PublisherList(ListView): model = Publisher
Görünüm kodu da yapıldı şimdi bunun urls'ye bağlanma aşamasını yapalım:
# urls.py from django.urls import path from books.views import PublisherList urlpatterns = [ path('publishers/', PublisherList.as_view()), ]
İşte bu kadar . Python kodlarını yazdık. Sırada template oluşturmak var. ;)
note: projenizde settings.py içinde "DIR" ALTINDA "template" klasörünü eklemeyi unutmayın.
Bu şablon object_list nesnesini publisher_list.html dosyasında görüntülemek için aşağıdaki kodu kullandık. Listenin içeriğini publisher.name göre for döngüsü ile ekrana alındığını görüyoruz.
{% extends "base.html" %} {% block content %} <h2>Publishers</h2> <ul> {% for publisher in object_list %} <li>{{ publisher.name }}</li> {% endfor %} </ul> {% endblock %}
Generic views kullanımını özelleştirmek ve genişletmek için kullanabileceğiniz bazı yaygın yolları ele neler olduğunu anlatmaya devam edelim.
Template contextlerin daha geliştirici dostu olması
(Making “friendly” template contexts)
Örnek yayıncı listesi şablonumuzun tüm yayıncıları object_list adlı bir değişkende sakladığını fark etmiş olabilirsiniz. Bu gayet iyi çalışsa da, şablon yazarları için o kadar "dostça" değil: burada yayıncılarla uğraştıklarını "bilmeleri" gerekiyor.Bir model nesneyle(model objects) uğraşıyorsanız, bu sizin için zaten yapılmıştır. Bir nesne veya sorgu kümesiyle (obect or dataset) uğraşırken, Django, model sınıfının adının küçük harfli sürümünü kullanarak bağlamı (context) doldurabilir. Bu, varsayılan object_list girişine ek olarak sağlanır, ancak tamamen aynı verileri içerir, yani object_list .
# views.py from django.views.generic import ListView from books.models import Publisher class PublisherList(ListView): model = Publisher context_object_name = 'my_favorite_publishers'
Ek bilgiler ekleme(Adding extra context)
Çoğunlukla, genel görünüm(genric views) tarafından sağlananların ötesinde bazı ekstra bilgiler sunmanız gerekir. Örneğin, her bir yayıncı ayrıntı sayfasında tüm kitapların bir listesini göstermeyi düşünün. DetailView genel görünümü(generic views) yayıncıya context(bağlam) sağlar, peki bu DetailViews bu şablonu nasıl değiştirilir veya eklemeler nasıl yaparız?from django.views.generic import DetailView from books.models import Book, Publisher class PublisherDetail(DetailView): model = Publisher def get_context_data(self, **kwargs): # Call the base implementation first to get a context context = super().get_context_data(**kwargs) # Add in a QuerySet of all the books context['book_list'] = Book.objects.all() return context
Context_data ile üst sınıftan alınan objectlerin üst sınıfta korunmaya devaö etmesi istenirse super( ) metodunu mutlaka kullanmak gerekir.
super() metodu ne yapar: Miras alarak oluşturduğumuz yani üst sınıftan oluşturduğumuz kendi sınıfımızın nitelik ve metotları üzerinde değişiklik yaparken, üst sınıfın mevcut özellikleri de muhafaza edebilmemizi sağlar.
Nesnelerin alt kümelerinin Görünümü (Viewing subsets of objects)
django da model argümanının kullanımına yakından bakalım. Hatırlayacak olursak model argümanının veritabanı(database) argumanını belirtir. Bu database leri views larda gösteririz. Bu viewslarda bir nesne veya daha fazla nesnle isteğe bağlı gösterilebilir. Database e sadece views larda değil sorgu kümesi (queryset) argümanını kullanarak nesnelerin listesini de belirtebilirsiniz. ilgil kodu inceleyelim.from django.views.generic import DetailView from books.models import Publisher class PublisherDetail(DetailView): context_object_name = 'publisher' queryset = Publisher.objects.all()
Kodda geçen model = Publisher belirtilmesi,
queryset = Publisher.objects.all()
. demenin kısaltmasıdır. Ancak, sorgu kümesini kullanarak filtrelenmiş bir nesne listesi tanımlayabilir, görünümde görünecek nesneler hakkında daha spesifik olabilirsiniz. (Bunun için QuerySet nesneleri hakkında daha fazla bilgi için sorgular yapma konusuna bakabilirsiniz ).Yayın tarihine göre kitap listesini almak istersek kodlar şöyle olur:
from django.views.generic import ListView from books.models import Book class BookList(ListView): queryset = Book.objects.order_by('-publication_date') context_object_name = 'book_list'
Belirli bir yayıncıya ait kitapların bir listesini almak için yine aynı tekniği kullanabilirsiniz:from django.views.generic import ListView from books.models import Book class AcmeBookList(ListView): context_object_name = 'book_list' queryset = Book.objects.filter(publisher__name='ACME Publishing') template_name = 'books/acme_list.html'Yukarıdaki örnek bir filtrelenmiş bir sorgu kümesi örneğidir. Böyle kullanımda özel bir şablon adı da kullandığımıza dikkat edin. Varsa diğer şablonlarla karışması önlenmelidir.
Dinamik Filtreleme (Dynamic Filtering)
Diğer bir yaygın ihtiyaç, bir liste sayfasında verilen nesneleri URL'deki bir anahtarla filtrelemektir. Daha önce, yayıncının adını URLconf'ta sabit bir şekilde kodlamıştık, ancak ya rasgele bir yayıncı tarafından tüm kitapları gösteren bir görünüm yazmak istersek?
1 Yorumlar
karar ve döngü yapısı ile nasıl problem oluşturabiliriz
YanıtlaSil1 problemi tanımlayınız
2 problemin çözümüne ait algoritma basamaklarını yazınız
3 problemin çözümüne ait akış şeması çiziniz
size mail atsam acaba bana birer tane örnek yazabilir misiniz