Bất cứ ai có thể giải thích cho tôi những điểm giống và khác nhau của Django's forms.Form
& forms.ModelForm
?
Câu trả lời:
Các biểu mẫu được tạo từ forms.Form
do bạn định cấu hình thủ công. Tốt hơn hết bạn nên sử dụng chúng cho các biểu mẫu không tương tác trực tiếp với các mô hình. Ví dụ: biểu mẫu liên hệ hoặc biểu mẫu đăng ký nhận bản tin, nơi bạn có thể không nhất thiết phải tương tác với cơ sở dữ liệu.
Biểu mẫu được tạo từ đâu forms.ModelForm
sẽ được tạo tự động và sau đó bạn có thể chỉnh sửa. Các ví dụ tốt nhất thực sự là từ tài liệu tuyệt vời được cung cấp trên trang web Django.
forms.Form
:
Tài liệu: Đối tượng biểu mẫu
Ví dụ về một biểu mẫu bình thường được tạo bằng forms.Form
:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
forms.ModelForm
:
Tài liệu: Tạo biểu mẫu từ mô hình
Trực tiếp từ tài liệu:
Nếu biểu mẫu của bạn sẽ được sử dụng để thêm hoặc chỉnh sửa trực tiếp mô hình Django, bạn có thể sử dụng biểu mẫu
ModelForm
để tránh trùng lặp mô tả mô hình của mình.
Ví dụ về biểu mẫu mô hình được tạo bằng forms.Modelform
:
from django.forms import ModelForm
from . import models
# Create the form class.
class ArticleForm(ModelForm):
class Meta:
model = models.Article
Biểu mẫu này tự động có tất cả các loại trường giống như Article
mô hình mà nó được tạo từ đó.
Điểm giống nhau là cả hai đều tạo ra các tập hợp đầu vào biểu mẫu bằng cách sử dụng các widget và cả hai đều xác thực dữ liệu được gửi bởi trình duyệt. Sự khác biệt là ModelForm nhận định nghĩa trường của nó từ một lớp mô hình được chỉ định và cũng có các phương thức xử lý việc lưu mô hình cơ bản vào cơ sở dữ liệu.
Đây là cách tôi mở rộng UserCreationForm nội trang myapp / form.py :
from django import forms
from django.contrib.auth.forms import UserCreationForm
class RegisterForm(UserCreationForm):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
email = forms.CharField(max_length=75)
class Meta(UserCreationForm.Meta):
fields = ('username','first_name','last_name', 'email')