{"id":1558,"date":"2026-05-24T02:09:56","date_gmt":"2026-05-23T23:09:56","guid":{"rendered":"https:\/\/mudosdigital.com\/tr\/?p=1558"},"modified":"2026-05-24T02:09:57","modified_gmt":"2026-05-23T23:09:57","slug":"django-ile-sifirdan-bir-isletme-web-sitesi-gelistirme","status":"publish","type":"post","link":"https:\/\/mudosdigital.com\/tr\/django-ile-sifirdan-bir-isletme-web-sitesi-gelistirme\/","title":{"rendered":"Django ile S\u0131f\u0131rdan Bir \u0130\u015fletme Web Sitesi Geli\u015ftirme"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Bu rehber teorik bir Django yaz\u0131s\u0131 olarak ba\u015flam\u0131yor. Amac\u0131m\u0131z \u00f6nce ger\u00e7ek bir proje kurmak, her a\u015famay\u0131 test etmek, taray\u0131c\u0131da g\u00f6rmek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Senaryomuz <strong>Mudos Clean<\/strong> ad\u0131nda yerel bir temizlik \u015firketi. Web sitesi servisleri listelemeli, her servis i\u00e7in detay sayfas\u0131 g\u00f6stermeli, teklif talebi toplamal\u0131 ve i\u015fletme sahibinin servisleri Django admin \u00fczerinden y\u00f6netmesine izin vermeli.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Ortam\u0131 Do\u011frulamak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Proje bo\u015f bir klas\u00f6rde ba\u015flad\u0131. Django dosyas\u0131 olu\u015fturmadan \u00f6nce ortam kontrol edildi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python --version\npython -m django --version<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do\u011frulanan ortam:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Python 3.11.9\nDjango 5.0.2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu ad\u0131m \u00f6nemli, \u00e7\u00fcnk\u00fc sonraki her \u015fey ger\u00e7ek bir Django kurulumuna dayan\u0131yor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Django Projesini Olu\u015fturmak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Proje \u015fu komutla olu\u015fturuldu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python -m django startproject config .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Windows taraf\u0131nda <code>django-admin<\/code> her zaman PATH i\u00e7inde olmayabiliyor. Bu y\u00fczden <code>python -m django<\/code> kullanmak daha g\u00fcvenilir bir ba\u015flang\u0131\u00e7 sa\u011flad\u0131. Komut, proje seviyesindeki <code>config<\/code> paketini ve <code>manage.py<\/code> dosyas\u0131n\u0131 olu\u015fturdu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lk yap\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>config\/\nmanage.py<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Services App&#8217;ini Olu\u015fturmak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130\u015f mant\u0131\u011f\u0131n\u0131 ayr\u0131 bir app i\u00e7inde tutmak i\u00e7in <code>services<\/code> app&#8217;i olu\u015fturuldu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py startapp services<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sonra <code>config\/settings.py<\/code> i\u00e7indeki <code>INSTALLED_APPS<\/code> listesine eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSTALLED_APPS = &#91;\n    \"django.contrib.admin\",\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"services\",\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu sayede servis listeleme, teklif talepleri, formlar, view&#8217;lar, template&#8217;ler ve testler <code>services<\/code> app&#8217;i i\u00e7inde temiz bir s\u0131n\u0131rla topland\u0131.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. \u0130\u015f Modelini Kurmak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bu i\u015fletme web sitesi i\u00e7in iki temel veri modeli yeterli:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Service<\/code>: \u015eirketin sundu\u011fu temizlik hizmeti<\/li>\n\n\n\n<li><code>QuoteRequest<\/code>: Ziyaret\u00e7inin g\u00f6nderdi\u011fi teklif talebi<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lk model yap\u0131s\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from django.db import models\n\n\nclass Service(models.Model):\n    title = models.CharField(max_length=120)\n    slug = models.SlugField(unique=True)\n    short_description = models.CharField(max_length=240)\n    description = models.TextField()\n    starting_price = models.DecimalField(max_digits=10, decimal_places=2)\n    is_featured = models.BooleanField(default=False)\n    created_at = models.DateTimeField(auto_now_add=True)\n\n    class Meta:\n        ordering = &#91;\"title\"]\n\n    def __str__(self):\n        return self.title\n\n\nclass QuoteRequest(models.Model):\n    TIMING_CHOICES = &#91;\n        (\"once\", \"One-time\"),\n        (\"weekly\", \"Weekly\"),\n        (\"monthly\", \"Monthly\"),\n    ]\n\n    service = models.ForeignKey(\n        Service,\n        on_delete=models.PROTECT,\n        related_name=\"quote_requests\",\n    )\n    full_name = models.CharField(max_length=120)\n    phone = models.CharField(max_length=40)\n    email = models.EmailField(blank=True)\n    address = models.CharField(max_length=255)\n    timing = models.CharField(max_length=20, choices=TIMING_CHOICES)\n    note = models.TextField(blank=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    is_contacted = models.BooleanField(default=False)\n\n    class Meta:\n        ordering = &#91;\"-created_at\"]\n\n    def __str__(self):\n        return f\"{self.full_name} - {self.service.title}\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu model kararlar\u0131n\u0131n pratik kar\u015f\u0131l\u0131\u011f\u0131 var:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>slug<\/code>, her servis i\u00e7in stabil URL sa\u011flar.<\/li>\n\n\n\n<li><code>is_featured<\/code>, \u00f6ne \u00e7\u0131kan servisleri homepage&#8217;de g\u00f6stermeyi sa\u011flar.<\/li>\n\n\n\n<li><code>PROTECT<\/code>, teklif talebi olan bir servisin yanl\u0131\u015fl\u0131kla silinmesini engeller.<\/li>\n\n\n\n<li><code>is_contacted<\/code>, i\u015fletme sahibine basit bir takip ak\u0131\u015f\u0131 verir.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. Admin Y\u00f6netimini Eklemek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bir i\u015fletme sitesi i\u00e7in i\u00e7erik y\u00f6netimi erken a\u015famada gerekir. Bu y\u00fczden Django admin hemen devreye al\u0131nd\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>services\/admin.py<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from django.contrib import admin\n\nfrom .models import QuoteRequest, Service\n\n\n@admin.register(Service)\nclass ServiceAdmin(admin.ModelAdmin):\n    list_display = (\"title\", \"starting_price\", \"is_featured\", \"created_at\")\n    list_filter = (\"is_featured\",)\n    search_fields = (\"title\", \"short_description\")\n    prepopulated_fields = {\"slug\": (\"title\",)}\n\n\n@admin.register(QuoteRequest)\nclass QuoteRequestAdmin(admin.ModelAdmin):\n    list_display = (\n        \"full_name\",\n        \"service\",\n        \"phone\",\n        \"timing\",\n        \"is_contacted\",\n        \"created_at\",\n    )\n    list_filter = (\"service\", \"timing\", \"is_contacted\")\n    search_fields = (\"full_name\", \"phone\", \"email\", \"address\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">B\u00f6ylece i\u015fletme sahibi kod yazmadan servisleri ve gelen talepleri y\u00f6netebilir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Public Workflow&#8217;u Kurmak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lk public ak\u0131\u015f \u00fc\u00e7 sayfadan olu\u015fuyor:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servis listesi<\/li>\n\n\n\n<li>Servis detay sayfas\u0131 ve teklif formu<\/li>\n\n\n\n<li>Teklif talebi ba\u015far\u0131 sayfas\u0131<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">App URL yap\u0131s\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from django.urls import path\n\nfrom . import views\n\napp_name = \"services\"\n\nurlpatterns = &#91;\n    path(\"\", views.service_list, name=\"service_list\"),\n    path(\"services\/&lt;slug:slug&gt;\/\", views.service_detail, name=\"service_detail\"),\n    path(\"quote-request-received\/\", views.quote_success, name=\"quote_success\"),\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ana URL dosyas\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from django.contrib import admin\nfrom django.urls import include, path\n\nurlpatterns = &#91;\n    path(\"admin\/\", admin.site.urls),\n    path(\"\", include(\"services.urls\")),\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Art\u0131k taray\u0131c\u0131n\u0131n ve testlerin vurabilece\u011fi ger\u00e7ek route&#8217;lar var.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Teklif Talebi Formunu Eklemek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Form, <code>QuoteRequest<\/code> modeli \u00fczerinden kuruldu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from django import forms\n\nfrom .models import QuoteRequest\n\n\nclass QuoteRequestForm(forms.ModelForm):\n    class Meta:\n        model = QuoteRequest\n        fields = &#91;\"full_name\", \"phone\", \"email\", \"address\", \"timing\", \"note\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Detay view&#8217;i hem sayfay\u0131 render ediyor hem de POST geldi\u011finde formu kaydediyor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def service_detail(request, slug):\n    service = get_object_or_404(Service, slug=slug)\n\n    if request.method == \"POST\":\n        form = QuoteRequestForm(request.POST)\n        if form.is_valid():\n            quote_request = form.save(commit=False)\n            quote_request.service = service\n            quote_request.save()\n            return redirect(\"services:quote_success\")\n    else:\n        form = QuoteRequestForm()\n\n    return render(\n        request,\n        \"services\/service_detail.html\",\n        {\n            \"service\": service,\n            \"form\": form,\n        },\n    )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu ilk tam i\u015f d\u00f6ng\u00fcs\u00fc: ziyaret\u00e7i bir servisi g\u00f6r\u00fcr, form doldurur ve lead veritaban\u0131na kaydedilir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Database Migration Olu\u015fturmak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modeller yaz\u0131ld\u0131ktan sonra migration olu\u015fturuldu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py makemigrations services<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c7\u0131kt\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Migrations for 'services':\n  services\\migrations\\0001_initial.py\n    - Create model Service\n    - Create model QuoteRequest<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu, model katman\u0131n\u0131n ger\u00e7ek database de\u011fi\u015fikli\u011fine d\u00f6n\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc kan\u0131tlar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. System Check \u00c7al\u0131\u015ft\u0131rmak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Testlerden \u00f6nce Django&#8217;nun yerle\u015fik kontrol\u00fc \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py check<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c7\u0131kt\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>System check identified no issues (0 silenced).<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu ad\u0131m settings, app registration, URL config ve model tan\u0131mlar\u0131n\u0131n yap\u0131sal olarak do\u011fru oldu\u011funu g\u00f6sterir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. \u0130lk Browser Kontrol\u00fcn\u00fc D\u00fczeltmek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lk browser kontrol\u00fc iki ger\u00e7ek problemi ortaya \u00e7\u0131kard\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lki: migration uygulanmadan site a\u00e7\u0131ld\u0131\u011f\u0131nda server error al\u0131nd\u0131. \u00c7\u00f6z\u00fcm:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py migrate --noinput<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu komuttan sonra homepage <code>200 OK<\/code> d\u00f6nd\u00fc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130kincisi: sayfa teknik olarak \u00e7al\u0131\u015f\u0131yordu ama database bo\u015f oldu\u011fu i\u00e7in kullan\u0131c\u0131ya bo\u015f g\u00f6r\u00fcn\u00fcyordu. Bu da yeni bir Django projesi i\u00e7in normal ama blog\/demonstrasyon i\u00e7in iyi bir ilk ekran de\u011fil. Bu y\u00fczden seed command eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py seed_services<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu komut \u00fc\u00e7 demo servis y\u00fckler:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Home Cleaning<\/li>\n\n\n\n<li>Office Cleaning<\/li>\n\n\n\n<li>Move-Out Cleaning<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c7\u0131kt\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Seeded demo services. Created: 3. Updated: 0.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu davran\u0131\u015f da testlenebilir hale getirildi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Temel Website Bile\u015fenlerini Eklemek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lk s\u00fcr\u00fcm \u00e7al\u0131\u015f\u0131yordu ama sadece ham sayfalardan olu\u015fuyordu. Ger\u00e7ek bir i\u015fletme web sitesinde \u015fu bile\u015fenler gerekir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Marka ve navigation i\u00e7eren header<\/li>\n\n\n\n<li>Net bir call-to-action<\/li>\n\n\n\n<li>\u0130\u015fletme ba\u011flam\u0131 veren footer<\/li>\n\n\n\n<li>Mobil cihazlar i\u00e7in responsive grid ve spacing<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tekrar\u0131 azaltmak i\u00e7in ortak template eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services\/templates\/services\/base.html<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sayfalar art\u0131k bunu extend ediyor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{% extends \"services\/base.html\" %}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Homepage, servis detay ve ba\u015far\u0131 sayfas\u0131 ayn\u0131 header, navigation, footer, typography ve responsive kurallar\u0131 payla\u015f\u0131yor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu davran\u0131\u015f testlere de eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self.assertContains(response, \"Primary navigation\")\nself.assertContains(response, \"A Django-powered service business website\")<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">12. G\u00f6rsel Geli\u015ftirme Senaryosunu Test Etmek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Temel site yap\u0131s\u0131 kurulduktan sonra \u015fu soru geldi: servisleri daha iyi g\u00f6rselle\u015ftirmek isteseydik ne yapard\u0131k?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130ki yayg\u0131n geli\u015ftirme test edildi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servis kartlar\u0131na ikon eklemek<\/li>\n\n\n\n<li>Mobil navigation i\u00e7in hamburger men\u00fc eklemek<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Service<\/code> modeline k\u00fc\u00e7\u00fck bir <code>icon<\/code> alan\u0131 eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ICON_CHOICES = &#91;\n    (\"home\", \"Home\"),\n    (\"briefcase\", \"Office\"),\n    (\"sparkles\", \"Deep cleaning\"),\n]\n\nicon = models.CharField(max_length=32, choices=ICON_CHOICES, default=\"sparkles\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130kinci migration olu\u015ftu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services\\migrations\\0002_service_icon.py\n  - Add field icon to service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Seed command de her demo servise uygun ikon atayacak \u015fekilde g\u00fcncellendi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Homepage ikonlar\u0131 \u015fu partial \u00fczerinden render ediyor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services\/templates\/services\/partials\/service_icon.html<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mobil navigation i\u00e7in checkbox tabanl\u0131 hafif bir hamburger toggle eklendi. Frontend framework eklemeden test edilebilir ve basit bir \u00e7\u00f6z\u00fcm elde edildi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testler geni\u015fletildi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self.assertContains(response, \"service-icon\")\nself.assertContains(response, \"Toggle navigation menu\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hamburger men\u00fcn\u00fcn a\u00e7\u0131k halini deterministik olarak screenshot almak i\u00e7in \u015fu route kullan\u0131ld\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/?menu=open<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">13. G\u00f6rsel Kan\u0131t Almak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Seed data, header\/footer, responsive layout, ikonlar ve mobil men\u00fc eklendikten sonra lokal siteden screenshot&#8217;lar al\u0131nd\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Desktop homepage:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/mudosdigital.com\/wp-content\/uploads\/2026\/05\/home-page-3.png\" alt=\"Homepage screenshot\"\/ loading=\"lazy\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Desktop service detail:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/mudosdigital.com\/wp-content\/uploads\/2026\/05\/service-detail-3.png\" alt=\"Service detail screenshot\"\/ loading=\"lazy\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile homepage:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/mudosdigital.com\/wp-content\/uploads\/2026\/05\/home-page-mobile-3.png\" alt=\"Mobile homepage screenshot\"\/ loading=\"lazy\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile service detail:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/mudosdigital.com\/wp-content\/uploads\/2026\/05\/service-detail-mobile-3.png\" alt=\"Mobile service detail screenshot\"\/ loading=\"lazy\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mobil homepage, hamburger men\u00fc a\u00e7\u0131k:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/mudosdigital.com\/wp-content\/uploads\/2026\/05\/home-page-mobile-menu-open-3.png\" alt=\"Mobile open menu screenshot\"\/ loading=\"lazy\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Testler davran\u0131\u015f\u0131 kan\u0131tlar; screenshot&#8217;lar ise yaz\u0131n\u0131n bo\u015f ya da bozuk bir ilk ekrana g\u00f6t\u00fcrmedi\u011fini kan\u0131tlar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mobil screenshot review s\u0131ras\u0131nda CTA ve uzun metinlerin dar viewport&#8217;ta k\u0131rp\u0131ld\u0131\u011f\u0131 g\u00f6r\u00fcld\u00fc. CSS, k\u00fc\u00e7\u00fck ekranlarda g\u00fcvenli sol hizalama, tek kolon kartlar ve sar\u0131lan ba\u015fl\u0131klar kullanacak \u015fekilde d\u00fczeltildi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14. Davran\u0131\u015f\u0131 Testlerle Kan\u0131tlamak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Test suite \u015fu kritik davran\u0131\u015flar\u0131 kaps\u0131yor:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servisin string representation&#8217;\u0131 title olarak d\u00f6n\u00fcyor.<\/li>\n\n\n\n<li>Servis liste sayfas\u0131 servisleri g\u00f6steriyor.<\/li>\n\n\n\n<li>Servis detay sayfas\u0131 teklif formunu g\u00f6steriyor.<\/li>\n\n\n\n<li>Teklif talebi kaydedilebiliyor.<\/li>\n\n\n\n<li>Seed command demo servisleri olu\u015fturuyor.<\/li>\n\n\n\n<li>Header ve footer render ediliyor.<\/li>\n\n\n\n<li>Servis ikonlar\u0131 homepage&#8217;de g\u00f6r\u00fcn\u00fcyor.<\/li>\n\n\n\n<li>Mobil men\u00fc a\u00e7\u0131k halde render edilebiliyor.<\/li>\n\n\n\n<li>Versiyon dosyas\u0131 okunuyor.<\/li>\n\n\n\n<li>Release command <code>VERSION<\/code> ve <code>CHANGELOG.md<\/code> dosyalar\u0131n\u0131 g\u00fcncelliyor.<\/li>\n\n\n\n<li>Remote release manifest ve workflow ad\u0131mlar\u0131 do\u011frulan\u0131yor.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Test komutu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sonu\u00e7:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Found 11 test(s).\nSystem check identified no issues (0 silenced).\n...........\n----------------------------------------------------------------------\nRan 11 tests in 0.151s\n\nOK<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu noktada site sadece anlat\u0131lm\u0131yor; davran\u0131\u015flar\u0131 testlerle kan\u0131tlan\u0131yor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">15. Bak\u0131m Release&#8217;lerini Otomatikle\u015ftirmek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130lk \u00e7al\u0131\u015fan s\u00fcr\u00fcmden sonra ger\u00e7ek soru maintenance olur. Bir i\u015fletme sitesi yay\u0131na al\u0131nd\u0131ktan sonra da ya\u015famaya devam eder: metinler de\u011fi\u015fir, servisler g\u00fcncellenir, tasar\u0131m iyile\u015ftirilir, bug fix gelir, ba\u011f\u0131ml\u0131l\u0131klar g\u00fcncellenir ve ileride farkl\u0131 dil versiyonlar\u0131 eklenir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu s\u00fcreci tekrar edilebilir yapmak i\u00e7in projeye basit bir versioning sistemi eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>VERSION\nCHANGELOG.md<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>VERSION<\/code> dosyas\u0131 aktif site versiyonunu tutar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0.4.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Footer bu dosyay\u0131 context processor \u00fczerinden okur ve her sayfada g\u00f6sterir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Version\nv0.4.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bak\u0131m release&#8217;i haz\u0131rlamak i\u00e7in management command eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py prepare_release 0.4.0 \\\n  --note \"Added remote tag-based release workflow.\" \\\n  --note \"Added release manifest artifact for deployment automation.\" \\\n  --note \"Added remote release runbook with deploy and rollback steps.\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komut <code>VERSION<\/code> dosyas\u0131n\u0131 g\u00fcnceller ve <code>CHANGELOG.md<\/code> dosyas\u0131n\u0131n ba\u015f\u0131na yeni release notlar\u0131n\u0131 ekler:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>## 0.4.0\n\n- Added remote tag-based release workflow.\n- Added release manifest artifact for deployment automation.\n- Added remote release runbook with deploy and rollback steps.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lokal bak\u0131m ak\u0131\u015f\u0131:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>K\u00fc\u00e7\u00fck g\u00fcncellemeyi yap.<\/li>\n\n\n\n<li>Test ekle ya da mevcut testleri g\u00fcncelle.<\/li>\n\n\n\n<li><code>python manage.py test<\/code> \u00e7al\u0131\u015ft\u0131r.<\/li>\n\n\n\n<li><code>python manage.py prepare_release<\/code> ile release haz\u0131rla.<\/li>\n\n\n\n<li><code>CHANGELOG.md<\/code> kontrol et.<\/li>\n\n\n\n<li>Deploy et.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Bu yap\u0131, ileride T\u00fcrk\u00e7e veya ba\u015fka dil s\u00fcr\u00fcmleri \u00fcretirken de i\u015fe yarar. Her lokalizasyon kontroll\u00fc bir versiyona ba\u011flanabilir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">16. Remote Release&#8217;leri Otomatikle\u015ftirmek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lokal release haz\u0131rl\u0131\u011f\u0131 faydal\u0131 ama tek ba\u015f\u0131na yeterli de\u011fil. Yeni versiyon remote&#8217;a push edildi\u011finde ne olaca\u011f\u0131n\u0131 da tan\u0131mlamak gerekir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu proje i\u00e7in tag tabanl\u0131 bir release workflow eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.github\/workflows\/release.yml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Remote release, semantic version tag ile tetiklenir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git tag v0.4.0\ngit push origin v0.4.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow mant\u0131\u011f\u0131:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Git tag -&gt; CI tests -&gt; release manifest -&gt; deploy hook -&gt; health check<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Remote workflow lokal testleri tekrar \u00e7al\u0131\u015ft\u0131r\u0131r:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py check\npython manage.py test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sonra release manifest \u00fcretir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python manage.py build_release_manifest --environment production --deploy-target managed-paas<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>release-manifest.json<\/code> \u015fu bilgileri ta\u015f\u0131r:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"version\": \"0.4.0\",\n  \"tag\": \"v0.4.0\",\n  \"environment\": \"production\",\n  \"deploy_target\": \"managed-paas\",\n  \"required_checks\": &#91;\n    \"python manage.py test\",\n    \"python manage.py check\"\n  ],\n  \"remote_release_steps\": &#91;\n    \"push git tag\",\n    \"run CI checks\",\n    \"deploy on successful checks\",\n    \"run post-deploy health check\"\n  ],\n  \"rollback\": {\n    \"strategy\": \"redeploy previous successful tag\"\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu manifest her release i\u00e7in izlenebilir bir artifact verir: hangi versiyon, hangi tag, hangi ortam, hangi deploy hedefi, hangi kontroller ve hangi rollback stratejisi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow iki secret kullan\u0131r:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DEPLOY_HOOK_URL\nPRODUCTION_HEALTHCHECK_URL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DEPLOY<em>HOOK<\/em>URL<\/code>, hosting provider&#8217;\u0131n deploy hook adresidir. Testler ba\u015far\u0131l\u0131 olduktan sonra production deploy tetiklenebilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>PRODUCTION<em>HEALTHCHECK<\/em>URL<\/code>, deploy sonras\u0131nda ba\u015far\u0131l\u0131 d\u00f6nmesi gereken public URL&#8217;dir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ayr\u0131ca remote release runbook eklendi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docs\/remote-release-runbook.md<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Remote release ak\u0131\u015f\u0131:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Lokal release&#8217;i <code>prepare_release<\/code> ile haz\u0131rla.<\/li>\n\n\n\n<li>Testleri lokal \u00e7al\u0131\u015ft\u0131r.<\/li>\n\n\n\n<li><code>VERSION<\/code>, <code>CHANGELOG.md<\/code> ve kod de\u011fi\u015fikliklerini commit et.<\/li>\n\n\n\n<li><code>v0.4.0<\/code> gibi bir Git tag olu\u015ftur.<\/li>\n\n\n\n<li>Tag&#8217;i push et.<\/li>\n\n\n\n<li>CI testlerinin \u00e7al\u0131\u015fmas\u0131n\u0131 bekle.<\/li>\n\n\n\n<li>Deploy hook&#8217;un yeni s\u00fcr\u00fcm\u00fc yay\u0131nlamas\u0131n\u0131 bekle.<\/li>\n\n\n\n<li>Health check&#8217;i do\u011frula.<\/li>\n\n\n\n<li>Sorun varsa \u00f6nceki ba\u015far\u0131l\u0131 tag&#8217;i tekrar deploy ederek rollback yap.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Bu ak\u0131\u015f, gelecekteki T\u00fcrk\u00e7e s\u00fcr\u00fcm i\u00e7in de aynen kullan\u0131labilir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">17. Nereye Deploy Etmeliyiz?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bu proje h\u00e2l\u00e2 lokal tutorial uygulamas\u0131. Production&#8217;a ge\u00e7meden \u00f6nce Django deployment checklist ele al\u0131nmal\u0131:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SECRET_KEY<\/code> environment variable&#8217;a al\u0131nmal\u0131.<\/li>\n\n\n\n<li><code>DEBUG = False<\/code> olmal\u0131.<\/li>\n\n\n\n<li><code>ALLOWED_HOSTS<\/code> ayarlanmal\u0131.<\/li>\n\n\n\n<li>Lokal SQLite yerine PostgreSQL kullan\u0131lmal\u0131.<\/li>\n\n\n\n<li>Production database&#8217;e migration uygulanmal\u0131.<\/li>\n\n\n\n<li>Static dosyalar <code>python manage.py collectstatic<\/code> ile toplanmal\u0131.<\/li>\n\n\n\n<li>Django production&#8217;da Gunicorn gibi bir WSGI server ile \u00e7al\u0131\u015fmal\u0131.<\/li>\n\n\n\n<li>VPS kullan\u0131l\u0131yorsa \u00f6n\u00fcne Nginx konulmal\u0131.<\/li>\n\n\n\n<li>HTTPS etkin olmal\u0131.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bu proje i\u00e7in iki mant\u0131kl\u0131 yol var.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>En basit yol: managed PaaS<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Python web service ve PostgreSQL sunan bir platform kullanmak ilk yay\u0131n i\u00e7in daha kolayd\u0131r:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Git repository -&gt; Python web service -&gt; PostgreSQL -&gt; environment variables -&gt; custom domain<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Render, Fly.io, Railway veya benzeri bir platform bu t\u00fcr uygulamalar i\u00e7in uygundur. Burada \u00f6nemli olan platform isminden \u00e7ok \u015fu \u00f6zelliklerdir: Python runtime, kal\u0131c\u0131 PostgreSQL, environment variable deste\u011fi, HTTPS, deploy loglar\u0131 ve tahmin edilebilir build\/deploy komutlar\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Daha kontroll\u00fc yol: VPS<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sunucu y\u00f6netimini de \u00f6\u011fretmek istiyorsak Ubuntu VPS kullan\u0131labilir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ubuntu VPS\nNginx\nGunicorn\nDjango\nPostgreSQL\nsystemd\nHTTPS<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bu daha fazla kontrol verir ama firewall, update, process manager, log, backup ve SSL yenileme sorumlulu\u011fu da getirir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu blog serisi i\u00e7in ilk ad\u0131m olarak managed PaaS daha mant\u0131kl\u0131. Daha sonra ayn\u0131 projeyi VPS \u00fczerinden deploy ederek sunucu y\u00f6netimi ayr\u0131 bir yaz\u0131da anlat\u0131labilir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">18. S\u0131rada Ne Var?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bundan sonraki ak\u0131\u015fta ayn\u0131 disiplin korunmal\u0131:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Yeni davran\u0131\u015f\u0131 ekle.<\/li>\n\n\n\n<li>Test yaz ya da g\u00fcncelle.<\/li>\n\n\n\n<li>Testleri \u00e7al\u0131\u015ft\u0131r.<\/li>\n\n\n\n<li>Blog i\u00e7eri\u011fini ancak sonra g\u00fcncelle.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130yi sonraki ad\u0131mlar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Production-ready static files ve styling<\/li>\n\n\n\n<li>Service area modeli<\/li>\n\n\n\n<li>Teklif talebi gelince email bildirimi<\/li>\n\n\n\n<li>Servisler i\u00e7in SEO alanlar\u0131<\/li>\n\n\n\n<li>Deployment&#8217;\u0131 ger\u00e7ek ortamda tamamlama<\/li>\n\n\n\n<li>T\u00fcrk\u00e7e ve di\u011fer dil s\u00fcr\u00fcmlerini versioned release olarak yay\u0131nlama<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sonu\u00e7<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bu yaz\u0131n\u0131n ana fikri s\u00fcre\u00e7. Django tutorial&#8217;\u0131, sadece g\u00fczel anlat\u0131ld\u0131\u011f\u0131nda de\u011fil, \u00e7al\u0131\u015fan kod ve ge\u00e7en testlerle desteklendi\u011finde g\u00fc\u00e7lenir. Bu iterasyonda proje kuruldu, i\u015f modeli eklendi, public sayfalar olu\u015fturuldu, teklif talepleri kaydedildi, migration&#8217;lar \u00fcretildi, bo\u015f ekran problemi seed data ile \u00e7\u00f6z\u00fcld\u00fc, header\/footer ve responsive yap\u0131 eklendi, servis ikonlar\u0131 ve hamburger navigation test edildi, lokal ve remote release otomasyonu kuruldu, desktop ve mobil screenshot&#8217;lar al\u0131nd\u0131 ve 11 test ba\u015far\u0131yla ge\u00e7ti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Art\u0131k elimizde T\u00fcrk\u00e7e dahil farkl\u0131 dil versiyonlar\u0131 i\u00e7in g\u00fcvenilir bir kaynak yap\u0131 var: her b\u00f6l\u00fcm ger\u00e7ek kod, ger\u00e7ek test ve ger\u00e7ek \u00e7\u0131kt\u0131ya dayan\u0131yor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.djangoproject.com\/\">Django Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/testing\/tools\/\">Django Testing Tools<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/5.0\/howto\/deployment\/checklist\/\">Django Deployment Checklist<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/5.0\/howto\/deployment\/wsgi\/\">Django How to Deploy with WSGI<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Evidence<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ortam Python 3.11.9 ve Django 5.0.2 ile do\u011fruland\u0131<\/li>\n\n\n\n<li>Proje python -m django startproject config . komutuyla olu\u015fturuldu<\/li>\n\n\n\n<li>services app&#8217;i python manage.py startapp services komutuyla eklendi<\/li>\n\n\n\n<li>\u0130lk browser kontrol\u00fc, migration uygulanmadan 500 hatas\u0131 verdi<\/li>\n\n\n\n<li>\u0130lk ba\u015far\u0131l\u0131 sayfa render&#8217;\u0131, demo servisler seed edilmeden bo\u015f g\u00f6r\u00fcnd\u00fc<\/li>\n\n\n\n<li>System check sorunsuz ge\u00e7ti<\/li>\n\n\n\n<li>Demo servisler python manage.py seed_services komutuyla eklendi<\/li>\n\n\n\n<li>Test suite ba\u015far\u0131l\u0131: 11 test ge\u00e7ti<\/li>\n\n\n\n<li>Header, navigation, footer ve responsive layout i\u00e7in ortak base template eklendi<\/li>\n\n\n\n<li>Servis ikon alan\u0131 eklendi ve seed data \u00fczerinden do\u011fruland\u0131<\/li>\n\n\n\n<li>Mobil hamburger navigation eklendi ve a\u00e7\u0131k men\u00fc screenshot&#8217;\u0131 ile test edildi<\/li>\n\n\n\n<li>Bak\u0131m otomasyonu VERSION, CHANGELOG.md ve prepare_release komutu ile eklendi<\/li>\n\n\n\n<li>Footer art\u0131k VERSION dosyas\u0131ndan gelen aktif versiyonu g\u00f6steriyor<\/li>\n\n\n\n<li>Remote release otomasyonu tag tabanl\u0131 GitHub Actions workflow&#8217;u ile eklendi<\/li>\n\n\n\n<li>Deploy ve rollback izlenebilirli\u011fi i\u00e7in release manifest artifact \u00fcretildi<\/li>\n\n\n\n<li>Homepage ve service detail sayfalar\u0131 i\u00e7in desktop screenshot&#8217;lar al\u0131nd\u0131<\/li>\n\n\n\n<li>Homepage ve service detail sayfalar\u0131 i\u00e7in 390&#215;844 mobil screenshot&#8217;lar al\u0131nd\u0131<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A proof-driven Django walkthrough where we build and test a business website from scratch before turning the process into a blog post.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-1558","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/posts\/1558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/comments?post=1558"}],"version-history":[{"count":1,"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/posts\/1558\/revisions"}],"predecessor-version":[{"id":1559,"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/posts\/1558\/revisions\/1559"}],"wp:attachment":[{"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/media?parent=1558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/categories?post=1558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mudosdigital.com\/tr\/wp-json\/wp\/v2\/tags?post=1558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}