Model | 数据库操作 |
Form | 用户请求的验证 |
ModelForm | 数据库操作(部分)用户请求验证(部分) |
Model操作
数据表操作
- Code First(代码优先)
- 创建类 -> 自动生成表
- DB First(数据库有限)
- 创建表 -> 自动生成类
类
一对多操作
# 用户表
class User(models.Model):
name = models.CharField(max_length=10)
email = models.EmailField(max_length=32)
# 与用户类型表建立一对多关系
user_type = models.ForeignKey('UserType')
# 用户类型表
class UserType(mdoels.Model):
name = models.CharField(max_length=10)
应用场景:
建立多对多操作的两种方式
- django的ManyToManyField()
更适合admin添加表数据
- 自己创建第三张表以两个ForeignKey()建立多对多关系
更适合调用表数据
一对一(OneToOneField())表
应用场景:1.单表过大,2.适合admin选择一对一数据
字段
数字
字符串
user = models.CharField() # 普通字符
email = models.EmailField() # 带正则的字符串
时间
二进制
文件
fiel = models.FileField(upload_to='path') # 文件
#图像
w = models.IntegerField() # 宽度
h = models.IntegerField() # 高度
img = ImageField(upload_to='path', width_field='w', height_field='h') # 自动获取图片宽高
字段参数
"""指定生成数据库列信息"""
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
"""外键字段参数"""
to
to_fields
related_name
on_delete
limit_choices_to
"""admin显示信息"""
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
"""验证信息"""
error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息;
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
如:{'null': "不能为空.", 'invalid': '格式错误'}
validators 自定义错误验证(列表类型),从而定制想要的验证规则
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
# 如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ]
)
数据行操作
create
delete
all
get
filter
exclude
filter(xx__in=[])
filter(xx__gte=[])
filter(xx__lte=[])
filter(xx__range=[])
filter(xx__contains=[])
filter(xx__icontains=[])
filter(xx__regex=[])
filter(xx_isnull)
filter(xx__in=[])[1:10]
only
defer
first
last
reverse
Q
F
get_or_create
update_or_create
in_bulk
extra
using
dates
exists
values
values_list
aggregate
raw
connections
update
add
set
remove
save
select_related
prefetch_related
count
distinct
order_by
group_by
annotate
none
Form
生成html,并附加强大的数据验证
<!-- html中 -->
调用后端传过来的form表单
{{ obj.as_p }}
{{ obj.as_ul }}
<table>
{{ obj.as_table }}
</table>
# 后端验证
def index(request):
if request.method == 'GET':
obj = UserForm()
render(request, 'index.html')
elif request.method == 'POST':
obj = UserForm(request.POST)
obj.is_valid() # 验证结果True|False
# obj.clean() # 符合规则的数据
obj.cleaned_data # 如果自定义了clean方法,使用cleaned_data获取错误信息
obj.errors() # 错误信息
render(request, 'index.html)
form函数
from django import forms
from django.forms import field
from django.core.exceptions import ValidationError
# 创建用户表单
class UserForm(forms.Form):
# 创建字段用户名
username = fields.CharField(label='用户名')
email = fields.EmailField(label='邮箱')
# 自定义验证方法
def clean_username(self):
"""
验证user字段数据
:return: 抛出异常或满足条件的值或自定义值
"""
# 获取用户输入数据
username_input = self.cleaned_data['username']
if 条件:
return username_input
else:
raise ValidationError('错误信息')
# 1. 重写clean方法,自定义错误信息(*)
def clean(self):
"""
多项数据组合验证
:return: 抛出异常,或返回self.cleaned_data
"""
username = self.cleaned_data['username']
email = self.cleaned_data['email']
if username == 'root' and email == '[email protected]':
return self.cleaned_data
else:
raise ValidationError('错误信息')
"""
但是因为重写了clean()方法,在views.py中,如果使用obj.clean()获取正确数据会抛出错误,我们要使用obj.cleaned_data获取所有输入的信息
"""
# 2. 纯粹自定义数据处理
def _post_clean(self):
"""
这里不允许报错,没有返回值,如果没满足条件,就添加错误信息
:return:
"""
try:
username_input = self.cleaned_data['user']
email_input = self.cleaned_data['email']
if username_input == 'wolf' and email_input == '[email protected]':
pass
except:
self.add_error('__all__', ValidationError('用户名或邮箱错误', code='error-info'))
models中也有full_clean()方法,不过需要自己处理异常
def full_clean(self):
try:
...
except:
...
ModelForm
有model和form的功能:实时更新choices数据,保存正确格式的输入信息,对于多对多表,同时保存三张表的数据
Model中
定义
from django import forms
class UserModelForm(forms.ModelForm):
class Meta:
model = models.User
fields = '__all__'
操作
def index(request):
if request.method == 'POST':
# 数据库对象
obj = models.User.objects.filter(id=1)
# 保存数据
obj = UserModelForm(request.POST, request.FILES)
obj.save()
# 对上面的对象修改
form_obj = UserModelForm(request.POST, instance=obj)
obj.save()
# 等价于下面三句
# instance = obj.save(commit=False) # 修改表本身数据
# instance.save()
# obj.save_m2mName() # 修改关联表数据
Form中
定义
操作
obj = forms.UserModelForm(request.POST, request.FILES)
obj.is_valid()
obj.clean()
obj.errors()
modelform中
from django import forms
class UserModelForm(forms.ModelForm):
class Meta:
# 取user的字段
model = models.User
# 对应所有字段
fields = '__all__'
ModelForm的Meta配置参数
from django.forms import widgets as wgt
class UserModelForm(forms.ModelForm):
class Meta:
model = models.User
fields = '__all__'
# fields = ['name', 'user_type']
exclude = ['name'] # 排除name
labels = {
'email': '邮箱',
'username': '用户名'
} # 批量修改label
help_texts = {
'email': '*',
} # 在对应的输入框后面添加帮助信息
widgets = {
'name': wgt.Textarea(attr={'class': 'c1'})
} # 设置窗口插件
error_message = {
'name': {'require': '不能为空', 'invalid': '格式错误'},
} # 设置错误信息
field_classes = {
'name': forms.EmailField
} # 按form中的规则做验证
localized_fields = ('ctime', ) # 本地化:某字段以本地时间显示