24 Temmuz 2014 Perşembe

ModelAdmin Metodları

ModelAdmin içerisinde kullanılabilen metodlar bulunmaktadır. Bu yazı da bazı metodların ne işe yaradıklarını ve nasıl kullanıldıklarını anlatmaya çalışacağız.
save_model(self, request, obj, form, change)
Bir model elemanı kaydedilirken olmasını istediğimiz şeyleri bu metot içerisinde yapabiliriz. Örneğin elimizde şöyle modeller olsun;
class Yazilar(models.Model):
    yazar = models.ForeignKey(User,blank=True,null=True)
    baslik = models.CharField(max_length=100)
    icerik = models.TextField()
Burada yazı kaydedilirken yazar kısmı giriş yapmış kullanıcı olsun istiyoruz. İşte bunun için save_model() metodunu kullanabiliriz.
class YazilarAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.yazar = request.user
        obj.icerik = "İçerik kısmını otomatik atadık." ##Bu şekilde model kaydedilirken istediğimiz alana müdahale edebiliriz.
        obj.save()

delete_model(self, request, obj)
save_model() metodunun tersi olarak modelden eleman silinirken olmasını istediklerinizi bu model içerisine yazabilirsiniz.
get_ordering(self, request):
Sıralama işleminin neye göre yapılacağının dönmesini bekler. Dönen değer liste veya demet olmalıdır.
class YazilarAdmin(admin.ModelAdmin):
    list_display = ['baslik','icerik']
    def get_ordering(self, request):
        if request.user.is_superuser:
            return ['baslik','icerik']
        else:
            return ['icerik']
Burada eğer kullanıcı süper ise, sıralama ile başlık için sonra içerik için yapılacaktır. Eğer kullanıcı süper değil ise, sıralama sadece içerik için yapılacaktır.
get_readonly_fields(self, request, obj=None):
Model alanlarından sadece okunabilir alanları geriye döndürür. Dönen değer liste veya demet olmalıdır.
    def get_readonly_fields(self, request, obj=None):
        return ['id']
Not: Bu kullandığımız fonksiyon ModelAdmin seçeneklerinden readonly_fields seçeneği ile aynı işlemleri yapmaktalar. Ama gördüğünüz gibi bunlar birer fonksiyon oldukları için istediğimiz kontrolleri yaparak bu kontrollere göre sonuçlar alabilmekteyiz. Fakat bu işlemleri ModelAdmin seçenekleri ile yaptığımız zaman yaptığımız işlem tüm hepsi için geçerli olmaktadır. Yani kontrol koyma imkanına sahip olamıyoruz.
get_list_display(self, request):
list_display seçeneği ile aynı işlevi görmektedir.
    def get_list_display(self, request):
        return ['baslik','icerik','kategori']
get_list_display_links(self, request, list_display):
list_display_links seçeneği ile aynı işlevi görmektedir.
    def get_list_display_links(self, request, list_display):
        return ['baslik','icerik',]
get_urls(self):
Metodunu kullanarak ModelAdmin içerisinde url tanımlaması yaparak bu url'i görünüme yönlendirebiliriz.
from django.conf.urls import patterns
from django.shortcuts import render_to_response
class YazilarAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(YazilarAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^gorunum/$', self.admin_site.admin_view(self.gorunum))
        )
        return my_urls + urls

    def gorunum(self, request):
        return render_to_response('gorunum.html')
Oluşturduğumuz url'e tarayıcıdan şu şekilde ulaşılır: http://localhost:8000/admin/uygulamaadi/modeladi/gorunum/
get_form(self, request, obj=None, **kwargs)
Form üzerinde değişiklik yapabilmemizi sağlar.
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = ['baslik_slug']
        return super(YazilarAdmin, self).get_form(request, obj, **kwargs)
Burada form içerisindeki baslik_slug alanını gizlemiş olduk. Bunun dışında doğrudan kendi oluşturmuş olduğumuz formu da kullanabiliriz.
from django.contrib.auth.forms import *
class YazilarFormu(forms.ModelForm):
    class Meta:
        model = Yazilar
        fields = ['baslik']


class YazilarAdmin(admin.ModelAdmin):
    def get_list_display(self, request):
        return ['baslik','icerik','kategori']

    def get_form(self, request, obj=None, **kwargs):
        return YazilarFormu
has_add_permission(self, request):
class YazilarAdmin(admin.ModelAdmin):
    def has_add_permission(self, request):
        if not request.user.is_superuser:
            return False
        return True
Ekleme iznini belirler. True veya False döndürür. Eğer False döndürür ise model için ekleme yapılamaz. Burada eğer kullanıcı süper kullanıcı değilse ekleme yapamaz.
has_change_permission(self, request, obj=None)
has_add_permission gibi çalışır. Eğer kullanıcının model üzerinde değiştirme yetkisi verilmemiş ise model sayfasını göremez.
class YazilarAdmin(admin.ModelAdmin):
    list_display = ['baslik']
    def has_change_permission(self, request, obj=None):
        if not request.user.is_superuser:
            return False
        return True
has_delete_permission(self, request, obj=None)
Ekleme ve değiştirmeden bir farkı yoktur. Eğer False döndürülür ise model elemanları silinemez olur. queryset(self, request)
Model üzerinde sorgu çalıştırabilmemizi sağlar. Örneğin aşağıdaki method eğer kullanıcı süper değil ise sadece kendi yazılarını görebilmesini sağlıyor.
class YazilarAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(YazilarAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(yazar=request.user)
Burada ki qs içerisinde tüm yazılar bulunmaktadır. Bu nesne üzerinden bu yazılar üzerinde sorgular çalıştırılabilir. Örneğin tüm yazıların tarihlerini güncelleyen şöyle bir fonksiyon yazılabilir.
import datetime
class YazilarAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(YazilarAdmin, self).queryset(request)
        for q in qs:
            q.tarih =datetime.datetime.now()
            q.save()
        return qs
Kaynakça

0 yorum :

Yorum Gönder