request
object เป็น argumentHttpResponse
object
from django.shortcuts import render
from django.http import HttpResponse
def my_view(request):
# Logic ของ View
context = {'message': 'Hello from FBV!'}
return render(request, 'my_template.html', context)
def another_view(request, name):
# View ที่รับ argument จาก URL
return HttpResponse(f"Hello, {name}!")
urls.py
ที่ map กับ Function Viewrender()
เพื่อสร้าง HttpResponse จาก templateHttpResponse()
เพื่อ return ข้อความโดยตรงView
, TemplateView
, ListView
, CreateView
)get()
, post()
, etc.
from django.views import View
from django.shortcuts import render
class MyView(View):
def get(self, request):
# Logic สำหรับ GET request
context = {'message': 'Hello from CBV!'}
return render(request, 'my_template.html', context)
def post(self, request):
# Logic สำหรับ POST request
# ...
return HttpResponse("POST request received")
as_view()
method ใน urls.py
เพื่อ map URL กับ CBVget()
, post()
, etc.) เพื่อจัดการ HTTP methods
urlpatterns = [
path('myview/', MyView.as_view(), name='myapp:myview')
]
<h1>Hello, {{ name }}!</h1>
<p>Today is {{ today }}.</p>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
templates/
render()
function ใน View เพื่อ render template{{ variable }}
, {% tag %}
) เพื่อแทรกข้อมูล{% extends %}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My Site{% endblock %}</title>
<head>
<body>
<h1>My Site</h1>
{% block content %}{% endblock %}
</body>
</html>
* ใช้ {% block %}
tag เพื่อกำหนดส่วนที่ child template สามารถ override ได้
{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
<p>Welcome to my site!</p>
{% endblock %}
* ใช้ {% extends %}
tag เพื่อบอกว่า template นี้ extends base template
* ใช้ {% block %}
tag เพื่อ override ส่วนต่างๆ ใน base template
{% include %}
<nav>
<a href="/">Home</a>
<a href="/about/">About</a>
<a href="/contact/">Contact</a>
</nav>
{% extends 'base.html' %}
{% block content %}
{% include 'navbar.html' %}
<p>Welcome to my site!</p>
{% endblock %}
* ใช้ {% include %}
tag เพื่อนำ template ส่วนย่อย มาใส่ใน template หลัก
{{ variable }}
{% tag %}
{{ variable|filter }}
<p>Hello, {{ user.name|upper }}!</p>
{% if user.is_authenticated %}
<p>Welcome back!</p>
{% else %}
<p>Please login.</p>
{% endif %}
<ul>
{% for item in items %}
<li>{{ item|default:"N/A" }}</li>
{% endfor %}
</ul>
urls.py
(project-level และ app-level)path()
หรือ re_path()
function
from django.urls import path
from myapp import views
urlpatterns = [
path('', views.index, name='index'),
path('about/', views.about, name='about'),
path('articles/<int:year>/', views.articles_by_year, name='articles_by_year'),
]
path()
: ใช้สำหรับ simple URL patternsre_path()
: ใช้สำหรับ regular expression based URL patterns (advanced)
)reverse()
functionstudents
object_list
ของ Student
myapp/views.py
)
from django.shortcuts import render
from myapp.models import Student
def students(request):
students = Student.objects.all()
context = {'students': students}
return render(request, 'student_list.html', context)
* ดึงข้อมูล Student ทั้งหมดจาก database
* ส่งข้อมูลไปยัง template myapp/templates/myapp/student_list.html
myapp/urls.py
)
from django.urls import path
from . import views
urlpatterns = [
path('students/', views.students, name='students'),
]
* Map URL /students/
ไปยัง view function students
* กำหนดชื่อ URL pattern เป็น students
myapp/templates/myapp/student_list.html
)
<h1>Student List</h1>
<ul>
{% for student in students %}
<li>{{ student.name }} - {{ student.email }}</li>
{% endfor %}
</ul>
* แสดง list ของ Student objects
* สามารถเพิ่มรายละเอียดเพิ่มเติม (เช่น dob) ได้
myapp/views.py
)
from django.shortcuts import render
from django.core.paginator import Paginator
from .models import Student
def students(request):
student_list = Student.objects.all()
paginator = Paginator(student_list, 10) # แสดง 10 รายการต่อหน้า
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {'page_obj': page_obj}
return render(request, 'student_list.html', context)
* สร้าง Paginator
object โดยระบุ list และจำนวนรายการต่อหน้า
* ดึงหมายเลขหน้าจาก request parameters (request.GET.get('page')
)
* ใช้ get_page()
เพื่อ get Page object
* ส่ง page_obj
ไปยัง template
myapp/templates/myapp/student_list.html
)
<h1>Student List</h1>
<ul>
{% for student in page_obj %}
<li>{{ student.name }} - {{ student.email }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
* ใช้ page_obj
ในการวน loop และแสดงข้อมูล
* แสดง pagination links (first, previous, next, last)
* page_obj.has_previous
, page_obj.has_next
, page_obj.previous_page_number
, page_obj.next_page_number
, page_obj.number
, page_obj.paginator.num_pages
คือ properties ของ Page object
myapp/views.py
)
from django.views.generic import ListView
from myapp.models import Student
class StudentListView(ListView):
model = Student
template_name = 'student_list.html' # ชื่อ Template
context_object_name = 'students' # ชื่อตัวแปรใน Template
paginate_by = 10 # จำนวน Student ต่อหน้า
* Inherit จาก ListView
* กำหนด model
, template_name
, context_object_name
, และ paginate_by
* ListView
จัดการ Paginator ให้โดยอัตโนมัติ
myapp/urls.py
)
from django.urls import path
from . import views
urlpatterns = [
path('students/', views.StudentListView.as_view(), name='students'),
]
* ใช้ .as_view()
เพื่อ map URL ไปยัง CBV
myapp/templates/myapp/student/list.html
)
<h1>Student List</h1>
<ul>
{% for student in page_obj %}
<li>{{ student.name }} - {{ student.email }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
* object_list
คือชื่อ default ของ list ที่ส่งมาจาก ListView
(หรือใช้ context_object_name
เพื่อเปลี่ยนชื่อ)
* page_obj
ยังคงใช้งานได้สำหรับการจัดการ pagination
blog
)Post
(title, content, author, date)urls.py
Post
ใน databasePost
ใน Templates