Menu
CoddyTech

Kiểm tra hai trường

Thuộc phần Biểu mẫu trong hành trình Django của Coddy. Bài học 11 trên 20.

Hội chợ sách mùa đông kéo dài ba ngày, và ngày kết thúc không được trước ngày bắt đầu. Phương thức clean_<field> chỉ xử lý một trường, nên quy tắc áp dụng cho nhiều trường phải đặt trong clean(), phương thức này chạy sau khi kiểm tra riêng từng trường. Ví dụ về biểu mẫu đặt chỗ, trong đó nhóm có hơn 6 khách phải cung cấp số điện thoại:

def clean(self):
    cleaned_data = super().clean()
    guests = cleaned_data.get("guests")
    phone = cleaned_data.get("phone")
    if guests and guests > 6 and not phone:
        raise forms.ValidationError("Groups over 6 need a phone number.")
    return cleaned_data

Trường không vượt qua bước kiểm tra sẽ không có trong cleaned_data, còn ngày tùy chọn để trống có giá trị None. Vì vậy, hãy đọc bằng .get() và chỉ so sánh khi cả hai giá trị đều có mặt.

Lỗi phát sinh trong clean() áp dụng cho toàn bộ biểu mẫu, nên vòng lặp qua các trường không hiển thị lỗi đó. {{ form.non_field_errors }} sẽ hiển thị lỗi.

challenge icon

Thử thách

Trung bình

Sự kiện có thêm ngày kết thúc.

  1. Trong events/forms.py, thêm trường ngày end_date không bắt buộc vào EventForm. Viết clean(): khi có cả hai ngày và ngày kết thúc đứng trước ngày bắt đầu, hãy báo lỗi The event cannot end before it starts. Lấy ngày bằng .get().
  2. Trong new_event, lưu cả end_date.
  3. Trong new_event.html, hiển thị form.non_field_errors phía trên vòng lặp.

Đặt ngày kết thúc trước ngày bắt đầu: bạn sẽ thấy thông báo đó.

Tự làm thử

import datetime

from django import forms


class EventForm(forms.Form):
    title = forms.CharField(max_length=100)
    date = forms.DateField()
    place = forms.CharField(max_length=100)
    description = forms.CharField(widget=forms.Textarea, required=False)
    capacity = forms.IntegerField(min_value=1)

    def clean_date(self):
        date = self.cleaned_data["date"]
        if date < datetime.date.today():
            raise forms.ValidationError("The date cannot be in the past.")
        return date
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Biểu mẫu

Tự luyện tập: Playground Django