Model | Form | ModelForm

mac2026-05-10  1

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 == 'root@163.com': 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 == 'wolf_sou1@163.com': 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', ) # 本地化:某字段以本地时间显示
最新回复(0)