Hướng dẫn Django cho người mới bắt đầu (P5)
Chúng ta có bản mẫu chi tiết cho polls/detail.html như sau:
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
<fieldset>
<legend><h1>{{ question.question_text }}</h1></legend>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
</fieldset>
<input type="submit" value="Vote">
</form>
path('<int:question_id>/vote/', views.vote, name='vote'),
Tiếp tục bạn hãy triển khai thêm phần hàm vote() bằng cách thêm phần sau vào polls/views.py
:
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from .models import Choice, Question
# ...
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
# hiển thị lại form bầu chọn câu hỏi
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
# luôn trả về HttpResponseRedirect sau khi xử lý thành công
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
request.GET
với quyền truy cập dữ liệu GET theo cách tương tự như request.POST
- là một đối tượng tương giống như từ điển - bạn có thể truy cập dữ liệu theo từ khóa. Trong trường hợp trên, request.POST['choice']
là trả về ID của lựa chọn đã chọn, dưới dạng một chuỗi. request.POST
giá trị luôn là chuỗi.
Ở trên chúng ta sử dụng reverse()
trong HttpResponseRedirect
với chức năng giúp tránh phải mã hóa cứng một URL. Trong trường hợp này, bằng cách sử dụng URLconf mà đã khởi tạo ở phần trước , reverse()
ở đây sẽ trả về một chuỗi như:
'/polls/3/results/'
vote()
chế độ xem sẽ chuyển hướng đến trang kết quả cho câu hỏi:
from django.shortcuts import get_object_or_404, render
def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/results.html', {'question': question})
Tiếp đến, hãy tạo một polls/results.html
mẫu:
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
/polls/1/
vào trình duyệt của bạn và bỏ phiếu cho câu hỏi. Bạn sẽ thấy một trang kết quả được cập nhật mỗi khi bạn bỏ phiếu. Chúng ta sẽ qua đến vấn đề chế độ xem, trong Django người ta cung cấp nhiều chế độ xem. Và ở đây ta sẽ sử dụng một vài chế độ xem đại diện cho những trường hợp phổ biến dành cho phát triển web cơ bản: lấy dữ liệu từ cơ sở dữ liệu theo một tham số được truyền trong URL, tải một mẫu và trả về mẫu được kết xuất. Bởi vì điều này rất phổ biến nên Django cung cấp một phím tắt, được gọi là hệ thống “generic views”.
Để chuyển đổi ứng dụng thăm dò ý kiến sang sử dụng hệ thống chế độ xem chung ta cần các bước sau:
Cuối cùng, mở polls/urls.py
URLconf và thay đổi nó như sau:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
Xem lại phần 4 tại: Hướng dẫn Django cho người mới bắt đầu (P4)
Nguồn: django tutorail