(dev20171205134007)
Muslu YÜKSEKTEPE
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.
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)),
path('', anasayfa,name='anasayfa'),
path('admin/', admin.site.urls),
2.2.Mobil tasarım destekli yönetim paneli
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')
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
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),
]
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(), }
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 )
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
python3.6 manage.py squashmigrations ilkuygulamam 0002 –squashed-name=sonikiguncelleme
e)Paginator’daki get_page hata yakalama eklendi.
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()
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
ilkuygulamam/models.py dosyasındaki Konular classına get_absolute_url fonksiyonunu eklemediniz.c)'Konular' object has no attribute 'get_absolute_url'
def get_absolute_url(self):
return '/' + self.islem_tarihi.strftime('%y/%m/%d') + '/' + self.yazar.username + '/' + slugify(self.baslik) + '/'
d)Page not found (404)
path('sitemap.xml', sitemap, {'sitemaps': konular_sitemap}, name='django.contrib.sitemaps.views.sitemap'),
e)ModuleNotFoundError: No module named ****
Django
hakkında diğer konular