Hướng dẫn Django cho người mới bắt đầu (P5)

Với phần 5 này, bạn sẽ hoàn thiện hơn cho ứng dụng đã tạo ở các phần trước bằng cách sửa đổi một vài thứ dưới đây.

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>
Ở mẫu tham khảo bên trên về mặt cơ bản là hiển thị một nút radio cho mỗi lựa chọn câu hỏi, ID và name của câu hỏi. Bây giờ bạn hãy thử tạo một dạng xem Django xử lý dữ liệu đã gửi và thực hiện tác động lên nó :
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,)))
Lưu ý rằng Django cũng cung cấp 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/'
Bây giờ bạn sẽ viết tiếp một đoạn tại polls/vew.py để sau khi ai đó bỏ phiếu hoặc chọn một câu hỏi, 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.htmlmẫ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>
Giờ đây, bạn truy cập /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:

  •   Chuyển đổi URLconf.
  •   Xóa một số chế độ xem cũ, không cần thiết.
  •   Giới thiệu các quan điểm mới dựa trên các generic views của Django.
  • 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

    4 phút đọc·632 lượt xem·2 years ago