Membangun aplikasi web di era modern memerlukan pondasi yang kokoh. Framework modern memberikan fleksibilitas luar biasa bagi developer untuk menghadirkan fitur kompleks secara cepat tanpa mengabaikan aspek keamanan dan keandalan sistem.
Tahapan Implementasi & Walkthrough Kode
Berikut adalah langkah demi langkah teknis yang dapat Anda ikuti langsung pada codebase Anda:
Tahap 1: Penulisan Kode & Konfigurasi
from django import forms
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=30, required=True)
email = forms.EmailField(max_length=254, required=True)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
labels = {
'username': _('Username'),
'first_name': _('Nama Depan'),
'last_name': _('Nama Belakang'),
'email': _('Email')
}
Tahap 2: Penulisan Kode & Konfigurasi
from django import forms
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
Tahap 3: Penulisan Kode & Konfigurasi
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=30, required=True)
email = forms.EmailField(max_length=254, required=True)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
labels = {
'username': _('Username'),
'first_name': _('Nama Depan'),
'last_name': _('Nama Belakang'),
'email': _('Email')
}
Tahap 4: Penulisan Kode & Konfigurasi
from django.views import View
from django.shortcuts import render, redirect
from django.contrib.auth.views import LoginView, LogoutView
from django.conf import settings
from django.contrib.auth import login, authenticate
from .forms import SignUpForm
class CustomLoginView(LoginView):
template_name = 'accounts/login.html';
redirect_authenticated_user = True
class HomeView(View):
template_name = 'accounts/home.html'
def get(self, request):
return render(request, self.template_name)
class CustomLogoutView(LogoutView):
template_name = 'accounts/login.html'
next_page = 'login'
class RegisterView(View):
template_name = 'accounts/register.html'
def get(self, request):
form = SignUpForm()
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('home')
return render(request, self.template_name, {'form': form})
Tahap 5: Penulisan Kode & Konfigurasi
from django.shortcuts import render, redirect
...
from django.contrib.auth import login, authenticate
from .forms import SignUpForm
Tahap 6: Penulisan Kode & Konfigurasi
class RegisterView(View):
template_name = 'accounts/register.html'
...
Tahap 7: Penulisan Kode & Konfigurasi
def get(self, request):
form = SignUpForm()
# menampilkan halaman register
return render(request, self.template_name, {'form': form})
...
Tahap 8: Penulisan Kode & Konfigurasi
def post(self, request, *args, **kwargs):
form = SignUpForm(request.POST)
# jika user mengisi form dengan data yang valid
if form.is_valid():
# data user baru akan disimpan
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
# melakukan login otomatis
user = authenticate(username=username, password=raw_password)
login(request, user)
# redirect ke halaman home
return redirect('home')
# jika user mengisi form dengan data yang tidak valid
# maka aplikasi akan menampilkan halaman register kembali dengan pesan error validasi form
return render(request, self.template_name, {'form': form})
Tahap 9: Penulisan Kode & Konfigurasi
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!------ Include the above in your HEAD tag ---------->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/all.css">
<style>
body {
margin-top: 50px;
}
</style>
</head>
<body>
<div class="container">
<br>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<header class="card-header">
<h4 class="card-title mt-2">Sign up</h4>
</header>
<article class="card-body">
{% load widget_tweaks %}
<form method="post" class="needs-validation {% if form.errors %}was-validated{% endif %}" novalidate>
{% csrf_token %}
<div class="form-row">
<div class="col form-group">
<label>{{ form.first_name.label }}</label>
{% if form.is_bound %}
{% if form.first_name.errors %}
{% render_field form.first_name class="form-control is-invalid" %}
{% else %}
{% render_field form.first_name class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field form.first_name class="form-control" %}
{% endif %}
{% for error in form.first_name.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div> <!-- form-group end.// -->
<div class="col form-group">
<label>{{ form.last_name.label }}</label>
{% if form.is_bound %}
{% if form.last_name.errors %}
{% render_field form.last_name class="form-control is-invalid" %}
{% else %}
{% render_field form.last_name class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field form.last_name class="form-control" %}
{% endif %}
{% for error in form.last_name.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div> <!-- form-group end.// -->
</div> <!-- form-row end.// -->
<div class="form-group">
<label>{{ form.username.label }}</label>
{% if form.is_bound %}
{% if form.username.errors %}
{% render_field form.username class="form-control is-invalid" %}
{% else %}
{% render_field form.username class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field form.username class="form-control" %}
{% endif %}
{% for error in form.username.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div> <!-- form-group end.// -->
<div class="form-group">
<label>{{ form.email.label }}</label>
{% if form.is_bound %}
{% if form.email.errors %}
{% render_field form.email class="form-control is-invalid" %}
{% else %}
{% render_field form.email class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field form.email class="form-control" %}
{% endif %}
{% for error in form.email.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div> <!-- form-group end.// -->
<div class="form-group">
<label>{{ form.password1.label }}</label>
{% if form.is_bound %}
{% if form.password1.errors %}
{% render_field form.password1 class="form-control is-invalid" %}
{% else %}
{% render_field form.password1 class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field form.password1 class="form-control" %}
{% endif %}
{% for error in form.password1.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div> <!-- form-group end.// -->
<div class="form-group">
<label>{{ form.password2.label }}</label>
{% if form.is_bound %}
{% if form.password2.errors %}
{% render_field form.password2 class="form-control is-invalid" %}
{% else %}
{% render_field form.password2 class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field form.password2 class="form-control" %}
{% endif %}
{% for error in form.password2.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div> <!-- form-group end.// -->
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block"> Register </button>
</div> <!-- form-group// -->
</form>
</article> <!-- card-body end .// -->
<div class="border-top card-body text-center">Sudah punya akun? <a href="{% url 'login' %}">Log In</a></div>
</div> <!-- card.// -->
</div> <!-- col.//-->
</div> <!-- row.//-->
</div>
<!--container end.//-->
</body>
</html>
Tahap 10: Penulisan Kode & Konfigurasi
from django.urls import path
# import class View
from .views import CustomLoginView, HomeView, CustomLogoutView, RegisterView
urlpatterns = [
path('login/', CustomLoginView.as_view(), name='login'),
path('home/', HomeView.as_view(), name='home'),
path('logout/', CustomLogoutView.as_view(), name='logout'),
path('register/', RegisterView.as_view(), name='register')
]
Tahap 11: Penulisan Kode & Konfigurasi
from .views import CustomLoginView, HomeView, CustomLogoutView, RegisterView
Tahap 12: Penulisan Kode & Konfigurasi
urlpatterns = [
...
path('register/', RegisterView.as_view(), name='register')
]
Selalu gunakan pendekatan deklaratif, validasi input seawal mungkin di boundary layer, dan lakukan logging terstruktur untuk memudahkan observability ketika sistem dijalankan di lingkungan cloud produksi.
Kesimpulan
Dengan mengikuti langkah-langkah terstruktur di atas, implementasi modul Anda akan jauh lebih rapi, aman dari bug umum, serta siap diskalakan ke lingkungan produksi.
Nantikan artikel tutorial praktis lainnya seputar fullstack development, microservices, dan otomasi AI di Blog Engineering SiHubung. Selamat mencoba!