Hướng dẫn Django cho người mới bắt đầu (P4)
Chỉnh sửa views:
-
Bây giờ chúng ta hãy thêm một vài views nữa vào
polls/views.py
:def detail(request, question_id):
return HttpResponse("Look at question %s." % question_id)
def results(request, question_id):
response = "Look at the results of question %s." return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("Voting question %s." % question_id)
Thực hiện như cũ, chuyển các views mới này vào polls/urls.py bằng các thêm các path:
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
detail()
và hiển thị bất kỳ ID nào bạn cung cấp trong URL. Khi ai đó yêu cầu một trang từ trang web của bạn - giả sử, “/ polls / 34 /”, Django sẽ tải mysite.urls
mô-đun Python vì nó được ROOT_URLCONF
cài đặt trỏ đến.
Bây giờ bạn có thể tiếp tục viết các views với chức năng nhất định. Ở đây bạn có thể tạo hiển thị 5 câu hỏi thăm dò mới nhất nằm trong hệ thống và sẽ được được phân cách bằng dấu phẩy và chia ra theo ngày xuất bản. Vào polls/views.py:
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
# Giữ nguyên các views còn lại (chi tiết, kết quả, bình chọn)
Ở đây thiết kế giao diện của trang đã được định sẵn nếu bạn muốn thay đổi giao diện thì cần thực hiện tạo một thư mục gọi là templates trong polls. Trong thư mục templates hãy tạo thêm một thư mục khác là polls và trong polls tạo tệp index.html. Chính xác đường dẫn ở đây là polls/templates/polls/index.html
. Sau đó bỏ đoạn mẫu dưới vào:
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
Bây giờ, hãy cập nhật index
trong polls/views.py
để sử dụng mẫu":
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
Thao tác với URL
Khi chúng ta thực hiện liên kết đến một câu hỏi trong polls/index.html thì liên kết sẽ được mã hoá như sau:
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
...
# added the word 'specifics'
path('specifics/<int:question_id>/', views.detail, name='detail'),
...
Để có thể dễ phân biết thì bạn có thể đặt tên cho các URL bằng cách thêm mục app_name vào trong polls/urls.py:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
- Sau đó thay đổi polls/index.html thành:
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
Xem lại phần 3 tại: Hướng dẫn Django cho người mới bắt đầu (P3)
Nguồn:django tutorial