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_dataTrườ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.
Thử thách
Trung bìnhSự kiện có thêm ngày kết thúc.
- Trong
events/forms.py, thêm trường ngàyend_datekhông bắt buộc vàoEventForm. Viếtclean(): 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ỗiThe event cannot end before it starts.Lấy ngày bằng.get(). - Trong
new_event, lưu cảend_date. - Trong
new_event.html, hiển thịform.non_field_errorsphí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
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
2Biểu mẫu Django
Một biểu mẫu DjangoTạo biểu mẫuTự luyện tập: Playground Django