26 Nisan 2024 18:47

Anasayfa

undefined...

Django 2.0.1

(dev20171205134007)

Django 2.0 Sürüm Notları

Muslu YÜKSEKTEPE

muslu.yuksektepe@makdos.com

 

1.Uygunluk

Django 1.11.x; Python 2.7’yi destekleyen son seridir.

Django; 2.0 ile artık Python 3.4, Python 3.5 ve Python 3.6’ya destek verecek.

Python 3.4 ile geliştirme planlıyorsanız Django 2.0 2019 Nisan’da geliştirme bırakıp üst serilere geçiş yapılacak. Çünkü Python 3.4 için 2019 Mart’da geliştirmeyi devam edilmeyecek.

Henüz karar vermediyseniz Django 1.11 LTS ile devam edebilirsiniz. 2020 Nisan’a kadar geliştirme ve destek devam edecek.

1.1.Eski sürümler için 3.parti destek

3. parti uygulama geliştiricileri nin eski sürüm kullanımdan kaldırıldı uyarısına kadar Django 1.11 ve diğer eski sürümlere de destek verilmesini talep ediyor. Kullanımdan kaldırılığı uyarısından sonra ise tamamen uyum sağlanmış olması gerekiyor.

2.Yenilikler

2.1.Basitleştirilmiş URL yönlendirme

 

Django bize yüksek kalitede web uygulamaları yapmamızı yardımcı olur. Doğal olarak da URL yapılarına çok önem verir.

 

.php, .cgi, .asp, html gibi dosya uzantılarına urllerde ihtiyacımız yok. Boşuna adres çubuğunda yer kaplarlar. Aynı zamanda ziyaretçiler içinde (özellikle paylaşımdan gelen bir linke) bakıldığında anlamlı ve kolay okunabilir olması daha iyidir.

 

Tim Berners-Lee’ nin de dediği gibi “URI’ler değişmez, insanlar değiştirir.”

 

Django geliştiricileri de bu yapıya sadık kalarak yeni kolaylıklar sağladılar.

 

Artık url() fonksiyonu yerine path() fonksiyonu geldi. Path mantığına göre de artık regex yerine direk yazım kullanılabilecek.

 

Eski:

url(r'^$', anasayfa,name='anasayfa'),

url(r'^admin/', include(admin.site.urls)),
Yeni:

	path('', anasayfa,name='anasayfa'),

path('admin/', admin.site.urls),  

 

 

2.2.Mobil tasarım destekli yönetim paneli

 

Django’nun sağladığı en önemli yararlardan biri de şüphesiz yönetim panelinin hazır gelmesi. Vakit kazandırdığı gibi bir çok işlemi de kolaylıkla yapabiliyor ve ürünü daha hızlı yayınlayabiliyorduk.

Şimdi ise yönetim paneli artık tüm mobil aygıtlara göre boyut değiştiren ( responsive ) şekilde hazırlandı.

 

 

2.3.Küçük değişiklikler

a)Admin panelinde otomatik tamamlama

ForeignKey ve ManytoManyField larda Select2 desteği ile otomatik tamamlama özelliği getirildi.

  

Örnek kullanım:

models.py

from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import ugettext_lazy as _

class Konular(models.Model) :
    yazar       =       models.ForeignKey(User, verbose_name=_('Yazar'), on_delete=models.CASCADE)
    baslik      =       models.CharField(_('Başlık'), max_length=120)
    detay       =       models.TextField(_('Detay'))
    oto_link    =       models.CharField(_('Otomatik Link'), max_length=120)
    def __str__(self):
        return str(self.baslik)
    class Meta:
        verbose_name_plural =       _('Konular')
        verbose_name        =       _('Konu')


admin.py

from django.contrib import admin
from ilkuygulamam.models import Konular

class KonularAdmin(admin.ModelAdmin):
    list_display        = ['baslik', 'oto_link']
    autocomplete_fields = ['yazar']
    ordering            = ['baslik']
    search_fields       = ['baslik', 'detay']
    prepopulated_fields = {"oto_link": ("baslik",)}

admin.site.register(Konular, KonularAdmin)

b)Sitemap fonksiyonuna protokol eklendi

 

Django; istediğiniz modeldeki verileri sitemap formatına uygun şekilde, xml dosyası haline getirip yayınlamanızı sağlabilir.

Django 2 ile birlikte artık sitemap içindeki “protocol” alanını değişken ile tanımlayabiliyoruz.

 

urls.py

from django.contrib import admin
from django.urls import path

from django.contrib.sitemaps.views import sitemap
from ilkuygulamam.sitemapler import konular_sitemap

from ilkuygulamam import views


urlpatterns = [

    path('', views.render_test, name='render_test'),

    path('sitemap.xml', sitemap, {'sitemaps': konular_sitemap}, name='django.contrib.sitemaps.views.sitemap'),

path('admin/', admin.site.urls),

]





ilkuygulamam/models.py

from django.contrib.auth.models import User, Group
from django.db import models
from django.template.defaultfilters import slugify
from django.utils.translation import ugettext_lazy as _


class Konular(models.Model) :
    yazar       =       models.ForeignKey(User, verbose_name=_('Yazar'), on_delete=models.CASCADE)
    grup        =       models.ManyToManyField(Group, verbose_name=_('Grup'))
    baslik      =       models.CharField(_('Başlık'), max_length=120)
    detay       =       models.TextField(_('Detay'))
    oto_link    =       models.CharField(_('Otomatik Link'), max_length=120)
    islem_tarihi=       models.DateTimeField (_(u'Son İşlem Tarihi'), auto_now = True)
    
def __str__(self):
        return str(self.baslik)

    def get_absolute_url(self):
        return '/' + self.islem_tarihi.strftime('%y/%m/%d') + '/' + self.yazar.username + '/' + slugify(self.baslik) + '/'

class Meta:
        verbose_name_plural =       _('Konular')
        verbose_name        =       _('Konu')


Uygulama klasörünüzün altında sitemapler.py adında bir dosya oluşturun. 

ilkuygulamam/sitemapler.py

from django.contrib.sitemaps import Sitemap
from ilkuygulamam.models import Konular
class KonularSitemap(Sitemap):
    changefreq = "never"
priority = 0.5
protocol = "https" # <----

def items(self):
            return Konular.objects.order_by('islem_tarihi')        
    def lastmod(self, obj):
            return obj.islem_tarihi
            konular_sitemap = {'konular': KonularSitemap(), }

 

ilksitem / settings.py

INSTALLED_APPS = ['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ilkuygulamam',
'django.contrib.sitemaps' # <--- ]

 

 

 

c)inspectdb ve MySQL ( PositiveIntegerField ve PositiveSmallIntegerField )

inspectdb; var olan veritabanındaki tablo ve sütunları class şeklinde (models.py) bir dosyaya aktarabilir. Django 2 ile MySQL PositiveIntegerField ve PositiveSmallIntegerField türleri de artık aktarılabiliyor.

 

python3.6 manage.py inspectdb > tumtablolar_models.py


Çoklu veritabanı kullanılıyor ise 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
},
'son_surum':{
        'ENGINE': 'django.db.backends.mysql',
}
}

python3.6 manage.py inspectdb –database 'son_surum' > sonsurum_models.py



d)squashmigrations artık squashed-name destekliyor

Django veritabanında yaptığımız değişiklikleri uygulama klasörü altındaki migrations klasöründe tutar ve migrate komutu ile veritabanında değişiklikleri (alter, delete, insert, update) yapar yani veri taşıma işlemi gerçekleştirir.

Bu değişiklikleri artık tek bir dosya altında tutabilir ve dosyanın adını da kendi isteğimize göre verebiliriz.

 

python3.6 manage.py squashmigrations ilkuygulamam 0002 –squashed-name=sonikiguncelleme

 

e)Paginator’daki get_page hata yakalama eklendi.

Paginator ile modelimizdeki kayıtları sayfalama yapabiliyoruz. get_page() fonksiyonu artık hatala karşı daha düzenli. Koşullar ile kontrol etmeye gerek kalmıyor.

 

Eğer istenen sayfa rakam değil ise ilk sayfaya, negatif ya da toplam sayfa sayısından büyük ise son sayfaya yönlendiriyor.

Örnek:

ilkuygulamam/views.py

def sayfalama(request):

    from ilkuygulamam.models import Konular
    from django.core.paginator import Paginator

    konu_listesi = Konular.objects.all()
    paginator = Paginator(konu_listesi, 1) ## her sayfada gösterilecek konu sayısı
sayfa = request.GET.get('sayfa')
    secili_sayfaki_konular = paginator.get_page(sayfa)
    print(secili_sayfaki_konular)

    return render(request, 'konular.html', {'secili_sayfaki_konular': secili_sayfaki_konular})


templates/konular.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Başlık</title>
</head>
<body>
{% for contact in secili_sayfaki_konular %}
    {{ contact.baslik|upper }} - ({{ contact.yazar }})<br/>
{% endfor %}
<div class="pagination">
<span class="current">
<p>Gösterilen sayfa: {{ secili_sayfaki_konular.number }} - Toplam sayfa: {{ secili_sayfaki_konular.paginator.num_pages }}</p>
        </span>
<span class="step-links">
{% if secili_sayfaki_konular.has_previous %}
            <a href="?sayfa=1"><< İlk sayfa</a>
<a href="?sayfa={{ secili_sayfaki_konular.previous_page_number }}">< önceki sayfa</a>
{% endif %}
        {% if secili_sayfaki_konular.has_next %}
            <a href="?sayfa={{ secili_sayfaki_konular.next_page_number }}">sonraki sayfa ></a>
<a href="?sayfa={{ secili_sayfaki_konular.paginator.num_pages }}">son sayfa >></a>
{% endif %}
    </span>
</div>
</body>
</html>

ilksitem/urls.py

from ilkuygulamam import views

path('konular/', views.sayfalama, name='sayfalama'),

2.4.Silinenler

a)User.is_authenticated() ve User.is_anonymous()

Eğer ziyaretçinin doğrulanmış ya da anonim mi kontrollerini fonksiyon olarak kontrole diyorsanız değiştirmeniz gerekir.

 

print(request.user.is_anonymous) if request.user.is_anonymous(): ## <----- print("True") else: print("False") 
TypeError: 'bool' object is not callable

2.5.Alınabilecek hatalar

a)TemplateDoesNotExist at /sitemap.xml

settings.py içindeki INSTALLED_APPS tanımlamalarına 'django.contrib.sitemaps' eklemediniz.

 

b)Bu siteye ulaşılamıyor. *.*.*.* bağlanmayı reddetti veya Bağlanılamadı. Firefox 127.0.0.1:8000 sunucusuyla bağlantı kuramıyor.

Kodlarda bir sorun var ve runserver çalışmıyor. Terminalden hatayı kontrol edin.

 

c)'Konular' object has no attribute 'get_absolute_url'

ilkuygulamam/models.py dosyasındaki Konular classına get_absolute_url fonksiyonunu eklemediniz.

 

def get_absolute_url(self):
    return '/' + self.islem_tarihi.strftime('%y/%m/%d') + '/' + self.yazar.username + '/' + slugify(self.baslik) + '/'


d)Page not found (404)

urls.py ye sitemap.xml yolunu tanımlamadınız.

    path('sitemap.xml', sitemap, {'sitemaps': konular_sitemap}, name='django.contrib.sitemaps.views.sitemap'),


e)ModuleNotFoundError: No module named ****

Kurulmamış modül eklenmeye çalışılıyor. Modülün kurulu olduğunu kontrol edin. Hatalı yazımda modül yokmuş hatası verir. İmport ettiğiniz modül adını kontrol edin.

Django

hakkında diğer konular

Makdos Bilişim Teknolojileri 2015 - 2022