外观
使用ModelForm
ModelForm通过Meta把db.Field自动转换为forms.Field,其中涉及到如下转换:
- validators不变。
- 添加widget属性,即前端的渲染方式。
- 修改Model包含的字段,通过fields来控制显示指定字段或者通过excludes排除指定字段。
- 修改错误信息。
下面使用ModelForm类替换Form表单类。修改如下:
from django import forms
from django.db import models
from django.forms import ModelForm, TextInput, DateInput
class User(models.Model):
"""
User模型类,数据模型应继承自models.Model或其子类
"""
id = models.IntegerField(primary_key=True) # 主键
user = models.CharField(max_length=30) # 用户名,字符串类型
email = models.CharField(max_length=30) # 邮箱,字符串类型
def __repr__(self):
return User.user
class Article(models.Model):
"""
Article模型类,数据模型应继承自models.Model或其子类
"""
id = models.IntegerField(primary_key=True) # 主键
title = models.CharField(max_length=120) # 标题,字符串类型
content = models.TextField() # 文章,文本类型
publish_time = models.DateTimeField() # 出版时间,日期时间类型
user = models.ForeignKey(User, on_delete=models.CASCADE) # 设置外键
def __repr__(self):
return Article.title
class UserModelForm(ModelForm):
class Meta:
model = User
fields = '__all__'
class ArticleModelForm(ModelForm):
content = forms.CharField(
label='内容',
widget=forms.Textarea(attrs={'class': 'form-control'}),
error_messages={
'required': '长度不能为空',
'mix_length': '长度不能少于10个字符'
}
)
class Meta:
model = Article
fields = ['title', 'content', 'publish_time']
widgets = {
'title': TextInput(attrs={'class': 'form-control'}),
'publish_time': DateInput(attrs={'class': 'form-control'})
}
error_messages = {
'title': {
'required': '标题不能为空',
'max-length': '长度不能超过三十个字符'
},
'publish_time': {
'required': '日期时间不能为空',
'invalid': '请输入正确的日期时间格式'
}
}在models.py文件中,新增的这两个类都继承自ModelForm类。Meta类中属性说明如下:
- model:关联的ORM模型。
- fields:表单中使用的字段列表。
- widgets:同Form类的widgets。
- error_messages:验证错误的信息。