Thursday, April 7, 2011

Menampilkan HTML Statis dengan Django

Beberapa hari yang lalu saya sedikit mengalami kesulitan dalam menampilkan halaman statis dengan Django dan menampilkannya lewat template yang saya buat. Pada tulisan saya sebelumnya, setelah dapat arahan dari milis komunitas 'id-python' dan utak-atik dokumentasi Django yang berkaitan dengan penggunaan file statis serta penggunaan modul untuk menampilkan halaman HTML statis, ternyata ada beberapa 'teknik' yang dapat digunakan untuk menampilkan file statis (termasuk file HTML statis), mulai dari penggunaan tag 'include' pada template, menggunakan modul 'staticfiles' hingga dengan menggunakan 'generic views'.

Banyaknya teknik untuk menampilkan halaman statis ini ternyata semakin membuat saya bingung apalagi saya menggunakan Django di Appengine yang tidak mendukung semua modul Django standar. Masih tetap penasaran, bagaimana caranya ya ? Setalah putar otak sedikit sambil  buka dokumentasi lagi akhirnya ketemu cara menampilkan halaman html statis yang saya inginkan tanpa perlu menggunakan tag {{% include %}}.

Uniknya, caranya ternyata sangat simpel dan mudah dan tak perlu modul macam-macam karena tinggal gimana kita bisa memodifikasi tampilan yang akan kita buat. Berikut contoh sederhanya, pertama kita buat halaman statis yang akan kita buat dan letakan pada template yang telah kita buat. Misalnya kita akan membuat tampilan tulisan  berikut :
HTML Statis
Ini halaman statis yang ditampilkan lewat views.py
Di Django, setiap block template yang kita buat agar dapat menampilkan konten block yang kita inginkan harus dilengkapi dengan tag {{  }} atau {% %} yang harus kita isi dengan variabel yang berisi value yang telah kita definisikan di views.py seperti contohnya {{ statis.content }} atau {% if var %}, bisa berisi string konten yang ingin kita tampilkan {{ '<h1>HTML Statis</h1>' }} dan bisa juga berisi tag dengan string kosong seperti ini {{ '' }}.

Dibawah ini merupakan template induk yang akan kita tampilkan di browser, yang diberi nama 'base.html' :

#base.html

<html>
<head>
<title Contoh Ajah </title>
</head>
<body>
{% block statis %}{% endblock %}
</body>
</html>

Berikut template yang kita buat, yang merupakan turunan (inherit) dari 'base.html', kita bisa membuat template dengan menggunakan tag filter {% ifequal %} seperti ini :


#template.html

{% extends "base.html" %}
{% block statis %}
{% ifequal html_statis "" %}
                  <h1>HTML Statis</h1>
                  <h3>Ini halaman statis yang ditampilkan lewat views.py</h3>
{% endifequal %}
{% endblock %}

Setelah itu kita buat kode untuk menampilkan template :

#views.py

def index(request):
   tpl = loader.get_template('template.html')
   ctx = Context({
            'html_statis':'',
        })
    return HttpResponse(tpl.render(ctx))


Atau kita dapat menggunakan 'dummy' context di views.py seperti ini :

def index(request):
   tpl = loader.get_template('template.html')
   ctx = Context({
            'html_statis':'string ini hanya pajangan',
        })
    return HttpResponse(tpl.render(ctx))


Dengan membuat template seperti ini :

#template.html

{% extends "base.html" %}
{% block statis %}
{% if html_statis %}
                  <h1>HTML Statis</h1>
                  <h3>Ini halaman statis yang ditampilkan lewat views.py</h3>
{% endif %}
{% endblock %}


Selain dengan cara di atas kita juga bisa membuat langsung di 'views.py' string HTML statis yang akan kita tampilkan (cara ini tidak direkomendasikan dalam Django)

# views.py

def index(request):
   statis = {'content':"""<h1>HTML Statis</h1>
                                <h3>Ini halaman statis yang ditampilkan lewat views.py</h3>""""
            }
   tpl = loader.get_template('template.html')
   ctx = Context({
            '
html_statis':statis,
        })
    return HttpResponse(tpl.render(ctx))


Sedangkan untuk kode template.html kita buat seperti ini :

#template.html

{% extends "base.html" %}
{% block statis %}
{% if html_statis %}
                  {{ statis.content }}
{% endif %}
{% endblock %}

Ternyata simpel dan mudah, tanpa perlu modul macam-macam tapi herannya para 'master' di komunitas 'id-python' kenapa tidak memberikan 'teknik' ini ya ? Kebanyakan mereka hanya menyodorkan link-link dokumentasi Django hingga saya bingung sendiri.

1 comment:

Rofa said...

Tulisan ini telah mengalami beberapa kali revisi