Django Tutorial Indonesia: Views dan Templates (Part 2)

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

Django Tutorial Indonesia yang membahas lebih lanjut mengenai Views dan Templates pada django. Pada part 1 sebelumnya kita telah membahas bagaimana cara menulis Views pada request dan response. Kita akan langsung mengimplementasikan pada project 'Catalog' yang telah kita buat pada serial tutorial django di web ini.

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



Belajar Django: Cara menulis Templates

Kita akan memisahkan code antara Views dan Templates, tujuannya agar tidak terlalu banyak hardcode pada Views, dan agar terlihat lebih rapi. Django sudah membuat sistem template yang bisa Views gunakan.

Kita mulai dengan membuat code berikut ini:
catalog/urls.py
path('', CatalogList.as_view(), name='catalog-list')
catalog/views.py

class CatalogList(generics.ListAPIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        catalogs = Catalog.objects.filter(is_active=True).order_by('-id')[:10]
        response = ', '.join([catalog.name for catalog in catalogs])
        return HttpResponse(response)

Kita akan mengambil 10 catalog aktif yang kita simpan pada database. Output yang dihasilkan adalah nama catalog yang dipisahkan dengan koma.
Belajar Django
Response list catalog (Belajar Django)


Jika kita ingin mengubah tampilan halaman, seperti memberikan style menggunakan CSS atau dynamic content menggunakan javascript, maka kita harus mengedit kode Python di Views tersebut. Inilah yang harus kita hindari agar bisa mencapai clean code.

Django Template System

Untuk itu, kita akan menggunakan sistem template yang sudah django sediakan. Caranya adalah sebagai berikut:
  • Buat file bernama templates di directory catalog Anda.
    Pengaturan TEMPLATE pada project Anda menjelaskan bagaimana Django akan memuat dan merender template. Kita bisa mengkonfigurasi DjangoTemplates di Default settings pada opsi APP_DIRS dan di set ke True. DjangoTemplates akan mencari subdirektori "templates" di setiap INSTALLED_APPS.

    Di dalam direktori templates yang baru saja Anda buat, buat direktori lain yang disebut catalog, dan di dalamnya buat file bernama index.html. Dengan kata lain, template Anda harus di catalog/templates/catalog/index.html. Karena cara kerja pemuat template app_directories seperti dijelaskan di atas, Anda dapat merujuk ke template ini di dalam Django sebagai catalog/index.html.
  • Buat endpoint baru untuk get catalog detail.
    catalog/urls.py
    path('<int:pk>/', CatalogById.as_view(), name='catalog-by-id')
    
    catalog/views.py
    class CatalogById(generics.RetrieveAPIView):
        permission_classes = (IsAuthenticated,)
        serializer_class = CatalogSerializer
        queryset = Catalog.objects.prefetch_related('products')
    
    catalog/serializer.py
    class CatalogSerializer(serializers.ModelSerializer):
       products = CatalogProductSerializer(many=True, read_only=True)
    
       class Meta:
            model = Catalog
            fields = ('id', 'name', 'description', 'is_active', 'is_default', 'created_at', 'updated_at', 'products')

    Jika kita hit endpoint catalog detail, maka response yang akan muncul adalah sebagai berikut:

    Django Template Tutorial

    Keterangan:
    - Catalog detail yang berisi data lengkap tentang catalog beserta products yang ada di dalamnya
    - Kita tidak perlu lagi menggunakan method get seperti class DefaultCatalogProductById, karena django sudah otomatis membaca primary key dari path url <int:pk>
    - Kita menggunakan RetrieveAPIView karena kita hanya butuh memanggil single model instance saja.

  • Selanjutnya, kita akan membuat template sederhana untuk menampilkan list catalog. Tambah code berikut ini ke dalam file index.html.
    {% if catalogs %}
        <ul>
        {% for catalog in catalogs %}
            <li><a href="/catalog/{{ catalog.id }}/">{{ catalog.name }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>Catalog tidak ditemukan.</p>
    {% endif %}
    

  • Langkah terakhir, kita akan melakukam update pada class CatalogList di catalog/views.py.
    - Import loader
    from django.template import loader
    - Update class CatalogList
    
      class CatalogList(generics.ListAPIView):
        permission_classes = (IsAuthenticated,)
    
        def get(self, request):
            catalogs = Catalog.objects.filter(is_active=True).order_by('-id')[:10]
            template = loader.get_template('catalog/index.html')
            context = {
                'catalogs': catalogs,
            }
            return HttpResponse(template.render(context, request))
    Hasilnya akan seperti gambar berikut:
    Belajar Django
    Belajar Django Template

    Kita hanya perlu memodifikasi tampilan menggunakan CSS, javascript dan sebagainya, agar tampilan web kita terlihat lebih menarik.

Tutorial Shortcut Views pada Django

Django menyediakan shortcut untuk memuat template yang kita buat. Salah satu contohnya, Anda bisa lihat code berikut ini:

    class CatalogList(generics.ListAPIView):
        permission_classes = (IsAuthenticated,)

        def get(self, request):
            catalogs = Catalog.objects.filter(is_active=True).order_by('-id')[:10]
            return render(request, 'catalog/index.html', {'catalogs': catalogs})
    

Kita bisa langsung menggunakan method render yang lebih efisien jika kita bandingkan dengan loader dan return HttpResponse. Fungsi render() mengambil objek request sebagai argumen pertamanya, nama template sebagai argumen kedua dan dictionary sebagai argumen ketiga (optional). Fungsi ini otomatis mengembalikan objek HttpResponse dari template dan konteks yang diberikan.

Contoh lain, kita telah menggunakan shortcut pada class DefaultCatalogProductById, yaitu menggunakan get_object_or_404. Fungsi get_object_or_404 mengembalikan single object yang diminta, atau jika tidak ditemukan maka akan return http status 404 not found.

Cara Namespacing URL

Pada file index.html, kita bisa melihat bahwa ada beberapa code yang kita hardcode pada bagian path url, yaitu:
 
    <li><a href="/catalog/{{ catalog.id }}/">{{ catalog.name }}</a></li>
    
Masalah utama hardcode adalah sulitnya mengubah URL pada proyek dengan banyak template. Namun, karena kita sudah mendefinisikan argumen name di fungsi path() di modul catalog.urls, kita dapat menghilangkan ketergantungan pada jalur URL tertentu dengan menggunakan tag template {% url %}:
 
    <li><a href="{% url 'catalog:catalog-by-id' catalog.id %}">{{ catalog.name }}</a></li>
    


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

Terimakasih, 


 tutorialsakti.com

LihatTutupKomentar