一对多操作
# 用户表 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') # 自动获取图片宽高生成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: ...有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', ) # 本地化:某字段以本地时间显示