Django中的Model、Form和ModelForm

时间:2023-03-08 23:07:56
Django中的Model、Form和ModelForm

一  Model(数据库操作)

1 数据表操作

两种类型:

  • Code First:创建类→自动生成表
  • DB First:创建表→自动生成类  (很少用)

单表操作:

一对多:(Forienkey)

多对多:(ManytoMany)

一对一(OneToOne):

应用场景:单表特别大,字段比较多的情况,可以把单表拆成两个,做一对一对应。

2 数据行操作

  • 数字
  • 字符串(带正则的字段)
  • 时间
  • 文件

http://www.cnblogs.com/wupeiqi/articles/6216618.html

二  Form(用户请求的验证)

三  ModelForm(数据库操作和用户请求验证部分功能)

1. 定义ModelForm类

from django import forms
from app01 import models class UserModelForm(forms.ModelForm):
class Meta:
model = models.User #关联的model类
fields = "__all__" #或('name','email','user_type') #验证哪些字段,"__all__"表示所有字段
exclude = None #排除的字段
labels = None #提示信息
help_texts = None #帮助提示信息
widgets = None #自定义插件
error_messages = None #自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
field_classes = None #自定义字段类(也阔以自定义字段)
localized_fields = () #本地化,根据settings中TIME_ZONE设置的不同时区显示时间

2. ModelForm验证执行的过程

Form所有的钩子ModelForm都有。

is_valid() --> self.errors --> full_clean() -->  self._clean_fields() -->  clean_字段名(自定义方法)
                          self._clean_form() -->  clean(self) 
                          self._post_clean() (整体错误)
clean_字段名(自定义方法)

可以抛出异常
    def clean_username(self):
value = self.cleaned_data['username']
if value == 'root':
return value
else:
raise ValidationError("你不是管理员!")

3. 验证

obj = UserModelForm()
obj.is_valid()
obj.errors.as_json()
obj.clean()
obj.cleaned_data

4. 创建

user_obj = models.User.objects.get(id=nid)
model_form_obj = UserModelForm(instance=user_obj)
model_form_obj = UserModelForm(request.POST)
model_form_obj.is_valid()
model_form_obj.save() #默认save(commit=True),默认保存多对多,当commit=False时可以拆分保存操作
#拆分为两步:
obj = obj.save(commit=False)
obj.save()    #保存请求表数据
model_form_obj.save_m2m()  #保存多对多数据

5.  更新和初始化

obj = model.tb.objects.get(id=1)
model_form_obj = XXOOModelForm(request.POST,instance=obj) #初始化
model_form_obj = XXOOModelForm(initial={...})