Django Tutorial Indonesia: Views dan Templates (Part 1)

Django Tutorial Indonesia
Django Tutorial Indonesia: Views dan Templates (Part 1)

Django Tutorial Indonesia yang membahas secara detail tentang fungsi atau cara penggunaan Views dan Templates pada django. Kita akan fokus dalam proses pembuatan public interface, yaitu 'Views'.

Tugas dari Views adalah untuk mengatur halaman web dan konten pada django. Setiap tampilan diwakili oleh fungsi Python, dimana Django akan memilih tampilan dengan memeriksa URL yang diminta. 

Untuk melanjutkan request dari URL ke Views, Django menggunakan apa yang dikenal sebagai 'URLconfs'. URLconf memetakan pola URL ke Views yang telah kita buat.



Belajar Django: Cara menulis Views

Melanjutkan tutorial sebelumnya, kita akan membuat views di apps catalog. Anda bisa melihat contoh views detail dan list seperti berikut ini:
  • Buka files catalog/views.py
  • Untuk list products, kita telah membuatnya pada class DefaultCatalogProduct
  • Selanjutnya, kita akan membuat detail product dengan membuat class baru, yaitu DefaultCatalogProductById
    class DefaultCatalogProductById(APIView):
        permission_classes = (IsAuthenticated,)
    
        def get(self, request, product_id):
            user_data = request.user
    
            return HttpResponse(f"Saya {user_data.username}, ingin mencari produk dengan ID {product_id}")

Setelah membuat views, kita akan mendaftarkan views tersebut ke dalam urls.py. Langkahnya adalah sebagai berikut:
  • Buka files catalog/urls.py
  • Tambahkan DefaultCatalogProductById pada saat import views
  • Tambahkan path url baru untuk detail produk ini di urlpatterns
    path('default/product/<int:product_id>', DefaultCatalogProductById.as_view(), name='default-product-by-id')

Jika kita lihat secara lengkap kode catalog list dan detail, maka akan menjadi seperti ini:
from django.http import HttpResponse
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView


class DefaultCatalogProduct(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        user_data = request.user
        data = request.query_params

        return HttpResponse(f"Saya {user_data.username}, ingin mencari produk {data.get('q', '')}")


class DefaultCatalogProductById(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, product_id):
        user_data = request.user

        return HttpResponse(f"Saya {user_data.username}, ingin mencari produk dengan ID {product_id}")

Jalankan url tersebut di browser Anda, maka akan muncul seperti gambar berikut ini:
Belajar Django
Belajar Django


Lihat di browser Anda, di "/product/1/". Ini akan menjalankan metode detail() dan menampilkan ID apa pun yang Anda berikan di URL. 

Ketika user membuka halaman dari situs web Anda, maka Django akan mencari route yang cocok dengan url yang telah kita buat di files urls.py. Django akan menemukan variabel bernama urlpatterns dan mencari url secara berurutan. 

Setelah menemukan kecocokan di path 'product/', django akan menghapus teks yang cocok tersebut ("product/") dan mengirimkan teks yang tersisa, yaitu product id "1/" untuk diproses lebih lanjut. Selanjutnya, teks yang tersisa itu cocok dengan '<int:product_id>/     ', sehingga menghasilkan panggilan ke tampilan detail() seperti berikut:
detail(request=<HttpRequest object>, product_id=1)

Keterangan:
  • Bagian product_id=1 berasal dari <int:product_id>. 
  • Menggunakan kurung sudut untuk "menangkap" bagian dari URL dan mengirimkannya sebagai keyword argumen ke fungsi views.
  • Bagian product_id dari string mendefinisikan nama yang akan kita gunakan untuk mengidentifikasi pola mana yang cocok, 
  • Bagian int adalah konverter yang menentukan pola yang cocok dengan URL ini. 
  • Tanda titik dua (:) memisahkan konverter dan nama pola.

Baca juga:
Belajar Django di Windows


Django Website Templates Tutorial

Setiap views bertanggung jawab untuk melakukan salah satu dari dua hal, yaitu mengembalikan objek HttpResponse yang berisi konten untuk halaman yang di request, atau memunculkan pengecualian seperti Http404. Sisanya tergantung dari kebutuhan Anda.

Views bisa Anda gunakan untuk mengambil data dari database, atau tidak. Views juga dapat generate file PDF, output XML, membuat file ZIP dengan cepat, atau apa pun yang Anda inginkan.

Sebagai contoh, mari kita coba update fungsi detail pada subbab sebelumnya untuk mengambil data dari database. Kita akan mencoba mengambil data produk sesuai dengan product_id yang dikirimkan oleh user.
  • Import model product dengan menambah kode berikut di bawah modul rest_framework
    from .models import Product
  • Update method get pada class DefaultCatalogProductById, sehingga menjadi seperti berikut ini:
      class DefaultCatalogProductById(generics.RetrieveAPIView):
        permission_classes = (IsAuthenticated,)
        serializer_class = CatalogProductSerializer
    
        def get(self, request, product_id):
            # Get product data
            product = get_object_or_404(
                Product,
                id=product_id,
                is_active=True,
                catalog__is_active=True,
                catalog__is_default=True)
    
            serializer = self.serializer_class(product)
            return JsonResponse(serializer.data)
  • Diatas kita menambah 1 line untuk memanggil serializer_class = CatalogProductSerializer. Maka dari itu, kita harus membuat file baru di apps catalog yang bernama serializers.py. Serializer ini berfungsi untuk mengkonversi instance model ke dictionary python.
  • Di dalam file  serializers.py, buat class baru bernama CatalogProductSerializer. Isinya adalah sebagai berikut:
    from rest_framework import serializers
    
    from .models import Product
    
    
    class CatalogProductSerializer(serializers.ModelSerializer):
       class Meta:
            model = Product
            fields = ('id', 'catalog', 'name', 'description', 'is_active', 'price', 'created_at', 'updated_at')

Keterangan:
  • Query diatas mengambil product yang sedang aktif di dalam catalog yang juga sedang aktif. Kita bisa langsung melakukan join query dengan menggunakan notasi double underscores ( __ ). Seperti contoh diatas, kita melakukan join dengan table catalog dengan kolom is_active=true, is_default=true (catalog__is_active dan catalog__is_default).
  • get_object_or_404 adalah shortcut untuk return http status 404, jika produk yang dicari tidak ditemukan. Kita akan membahas lebih lanjut mengenai shortcut di artikel Django Tutorial Indonesia: Views dan Templates (Part 2). Response yang dihasilkan sesuai contoh gambar berikut ini:

    Django Template Tutorial
    Django Template Tutorial (404 Not Found)

  • Jika kita ingin mengubah format response menjadi json, maka kita perlu menambah import JsonResponse.
    from django.http import HttpResponse, JsonResponse
  • Serializer diatas akan mengeluarkan response sesuai dengan fields yang ada di class meta. Anda juga bisa menambahkan field yang lain atau custom field sesuai kebutuhan Anda. Ini akan kita bahas pada artikel-artikel selanjutnya. 
  • Response yang akan tampil adalah sebagai berikut:

    Django Website Templates
    Django Website Templates (Response Sukses)

Penutup Django Tutorial Indonesia

Secara keseluruhan, kode untuk catalog views nya adalah sebagai berikut:
from django.http import HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

from .models import Product
from .serializers import CatalogProductSerializer


class DefaultCatalogProduct(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        user_data = request.user
        data = request.query_params

        return HttpResponse(f"Saya {user_data.username}, ingin mencari produk {data.get('q', '')}")


class DefaultCatalogProductById(generics.RetrieveAPIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = CatalogProductSerializer

    def get(self, request, product_id):
        # Get product data
        product = get_object_or_404(
            Product,
            id=product_id,
            is_active=True,
            catalog__is_active=True,
            catalog__is_default=True)

        serializer = self.serializer_class(product)
        return JsonResponse(serializer.data)


Di artikel ini kita telah membahas mengenai Django Tutorial Indonesia: Views dan Templates (Part 1). Selanjutnya kita akan membahas tentang Django Tutorial Indonesia: Views dan Templates (Part 2).

Terimakasih, 


 tutorialsakti.com

LihatTutupKomentar