Django 之 ModelForm组件

  Django内部封装的 ModelForm组件,是Django 框架里 model与form组件的结合体,拥有models和Form的所有功能。ModelForm组件与Form组件继承的是同一个类。

引用方法:

from django.forms import ModelForm

基本语法:

from django.forms import ModelForm
from django.forms import fields
from django.forms import widgets

class TestForm(ModelForm):
	字段 = fields.CharField()   #覆盖
	
	class Meta:
		该类下的主要方法,请看下面详解
	
	#也可以自定义字段的验证规则
	def clean_字段名(self):
		pass

参数及应用详解:

ModelForm
    a.  class Meta:
            model,                           # 对应Model的数据,注意只能是一张表,多了不行!表内有Fk or M2M .. 可以进行连表操作
            fields=None,                     # 字段  '__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=('birth_date',) # 本地化,如:根据不同时区显示数据
            如:
                数据库中
                    2016-12-27 04:10:57
                setting中的配置
                    TIME_ZONE = 'Asia/Shanghai'
                    USE_TZ = True
                则显示:
                    2016-12-27 12:10:57
    b. 验证执行过程
        is_valid -> full_clean -> 钩子 -> 整体错误
 
    c. 字典字段验证
        def clean_字段名(self):
            # 可以抛出异常
            # from django.core.exceptions import ValidationError
            return "新值"
    d. 用于验证
        model_form_obj = XXOOModelForm() #实例化对象
        model_form_obj.is_valid() #验证
        model_form_obj.errors.as_json() #错误信息
        model_form_obj.clean()
        model_form_obj.cleaned_data  #验证之后的值
    e. 用于创建
        model_form_obj = XXOOModelForm(request.POST)
        #### 页面显示,并提交 #####
        # 默认保存多对多
            obj = form.save(commit=True)
        # 不做任何操作,内部定义 save_m2m(用于保存多对多)
            obj = form.save(commit=False)
            obj.save()      # 保存单表信息
            obj.save_m2m()  # 保存关联多对多信息
 
    f. 用于更新和初始化
        obj = model.tb.objects.get(id=1)
        model_form_obj = XXOOModelForm(request.POST,instance=obj)
        ...
 
        PS: 单纯初始化
            model_form_obj = XXOOModelForm(instance=obj)
class TestModelForm(ModelForm):
    user = ffields.EmailField(label='用户名')  #覆盖原方法,执行重写字段方法

    class Meta:
        model = models.UserInfo
        fields = "__all__"
        error_messages = {
            'user':{'required':'用户名不能为空'},
            'email':{'required':'邮箱不能为空','invalid':'邮箱格式错误'},
        }
        labels = {
            'user': '用户名',
            'email': "邮箱"
        }
        help_texts = {
            'user': "帮你一下"
        }
        #插件
        widgets = {
            'user': fwidgets.Textarea(attrs={'class':'c1'})
        }
        #重写字段类
        field_classes = {
            'user': ffields.EmailField
        }

    # def clean_user(self):
    #     pass
    #
    # def clean_email(self):
    #     pass
def test(request):
    if request.method == "GET":
        form = TestModelForm()
        context = {
            'form': form
        }
        return render(request,'test.html',context)
    else:
        form = TestModelForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('http://www.oldboyedu.com')
        context = {
            'form': form
        }
        return render(request, 'test.html', context)


def edit(request,nid):
    obj = models.UserInfo.objects.filter(id=nid).first()
    if request.method == "GET":
        form = TestModelForm(instance=obj)
        context = {
            'form': form
        }
        return render(request, 'edit.html', context)
    else:
        form = TestModelForm(instance=obj,data=request.POST,files=request.FILES)
        if form.is_valid():
            form.save()
            return redirect('http://www.oldboyedu.com')
        context = {
            'form': form
        }
        return render(request, 'test.html', context)
应用举例

注意点:
  1、ModelForm中初始化传值使用的是instance = obj,传值是个对象,这里是与Form组件(install={})的不同点。
  2、ModelForm往数据库中保存数据仅有一个操作:save(),如果创建的ModelForm的对象,传值没有 instance=obj 初始值,那他会向数据库添加一条数据;若是有是对相应数据进行更改。

 

posted @ 2017-09-06 16:35  细雨蓝枫  阅读(223)  评论(0编辑  收藏  举报