Model | Form | ModelForm

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)

应用场景:

建立多对多操作的两种方式

  1. django的ManyToManyField()

更适合admin添加表数据

  1. 自己创建第三张表以两个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', )	# 本地化:某字段以本地时间显示
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章