博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【python】-- Django ModelForm
阅读量:5104 次
发布时间:2019-06-13

本文共 6484 字,大约阅读时间需要 21 分钟。

Django ModelForm

Django的ModelForm的验证方式相比较form + Model的验证方式有下列区别:

  • ModelForm没有form + Model的低耦合性
  • ModelForm更适合小型项目,而form + Model则无此限制
  • 都是继承BaseForm类,因此也能使用BaseForm中的三个内置钩子

一、ModelForm简单示例:

1、进行modelForm实例之前先在models中创建两张表

from django.db import models # Create your models here. class UserType(models.Model):    caption = models.CharField(max_length=32) class UserInfo(models.Model):    username = models.CharField(max_length=32)    email = models.EmailField()    user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)

2、在form.py中创建ModelForm

from app01 import modelsfrom django import formsfrom django.forms import fields class UserInfoModelForm(forms.ModelForm): #还是在forms里面,需要继承modelform     class Meta:        model = models.UserInfo  #表示去哪一个类里面去获取字段        fields = '__all__' #能获取字段,也可以对这张表进行增删改查,all表示展示所有列        #fields = ['username',]  #只选择username列,这个是UserInfo中的字段        #exclude = ["username"] #排除username字段,展示其他字段

3、在view.py中设置验证函数

def index(request):    if request.method == "GET":        obj = UserInfoModelForm()  #验证时,创建modelform对象        return render(request,'index.html',{'obj':obj})    elif request.method == "POST":        obj = UserInfoModelForm(request.POST) #在views函数里面做校验        return  render(request,'index.html',{'obj':obj})

4、templas中的HTML模板设置

    
{
{ obj.as_p }}

 

二、ModelForm中的内置组件、数据保存、示例

1、ModelForm除modle、fields、exclude组件外,其他组件介绍:

ModelForm    class Meta:        model,                           # 对应Model的        fields=None,                     # 字段        exclude=None,                    # 排除字段        labels=None,                     # 提示标签设置        """        labels = {            'username':'用户名',            'email':'邮箱',        }        """        help_texts=None,                 # 输入框后的帮助提示信息        """        help_texts = {            'username':'....',            'email':'xxx@126.com',        }        """        widgets=None,                    # 自定义插件        """        from django.forms import widgets as Fwidgets  #需要导入html插件,并且需要重新命名,因为跟关键字重复了        #html插件        widgets = {            "username":Fwidgets.Textarea(attrs={'class':'c1'})  #加上属性        }        """        error_messages=None,             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)        """        error_messages = {                "__all__":{                    #定义整体的错误信息                },                'email':{                    'required':'邮箱不为空', # 根据required是code值                    'invalid':"邮箱格式错误"                }        }        """        field_classes=None               # 自定义字段类 (也可以自定义字段)        """        #把标签的格式转换为其他格式,这边需要导入fields,但是需要重新起一个别名不然会跟自身的fields冲突,就会报错        from django.forms import fields as Ffields #导入fields,并且取一个别名        field_classes = {            'email':Ffields.URLField #把email格式转换为url格式        }        """        localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据        """        如:            数据库中                2016-12-27 04:10:57            setting中的配置                TIME_ZONE = 'Asia/Shanghai'                USE_TZ = True            则显示:                2016-12-27 12:10:57        """        # ##自定义字段        """        #modelform可以自定义一些字段,比如10天免登录,这个东西不需要提交到后台的        class UserInfoModelForm(forms.ModelForm):            #自定义字段            is_rmb = Ffields.CharField(                widget=Fwidgets.CheckboxInput() #modelform可以自定义一些字段,比如10天免登录,这个东西不需要提交给后台的            )                     class Meta:                model = models.UserInfo                         fields = "__all__"        """

2、models下ForeignKey、ManyToMany的数据保存

1 class UserType(models.Model): 2     caption = models.CharField(max_length=32) 3   4   5 class UserGroup(models.Model): 6     name = models.CharField(max_length=32) 7   8 class UserInfo(models.Model): 9     username = models.CharField(max_length=32)10     email = models.EmailField()11     user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)12     u2g = models.ManyToManyField(UserGroup)  #跟上面的UserGroup建立多对多关系
models
#1对1的外键,验证通过后,save()一下,数据就直接可以保存在数据库了def index(request):    if request.method == "GET":        obj = UserInfoModelForm()        return render(request,'index.html',{
'obj':obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) if obj.is_valid(): obj.save() #验证成功之后,是直接保存在数据库中 """ form + model中的验证函数 # print(obj.is_valid()) # print(obj.cleaned_data) # print(obj.errors.as_json()) """ return render(request,'index.html',{
'obj':obj})
ForeignKey
1 def index(request): 2     if request.method == "GET": 3         obj = UserInfoModelForm() 4         return render(request,'index.html',{
'obj':obj}) 5 elif request.method == "POST": 6 obj = UserInfoModelForm(request.POST) 7 if obj.is_valid(): 8 # commit为true时将会同时保存回将UserInfo表和其多对多关系表同时进行保存,为false时什么都不会做,需要自己手动保存UserInfo表和其多对多关系表 9 obj.save(commit=True)10 11 instance = obj.save(commit=False) # 什么保存操作都不回做12 instance.save() # 这个不等于obj.save(),它只保存当前这个表数据,不会保存其多对多关系表13 obj.save_m2m() # 保存其多对多关系表14 return render(request,'index.html',{
'obj':obj})
ManyToMany

3、示例

1 from app01 import models 2  3  4 def user_list(request): 5     li = models.UserInfo.objects.all().select_related('user_type')  #select_related 只能是外键,不能是多对多 6     return render(request,'user_list.html',{
'li':li}) 7 8 def user_edit(request,nid): 9 if request.method == "GET":10 user_obj = models.UserInfo.objects.filter(id=nid).first()11 mf = UserInfoModelForm(instance=user_obj) #把对象传进来,在前端就能显示默认值12 return render(request,'user_edit.html',{
'mf':mf,'nid':nid})13 elif request.method == "POST":14 user_obj = models.UserInfo.objects.filter(id=nid).first()15 mf = UserInfoModelForm(request.POST,instance=user_obj) #我把数据提交过来了,并且我拿到对哪个对象进行更新数据16 if mf.is_valid():17 mf.save()18 else:19 print(mf.errors.as_json())20 return render(request,'user_edit.html',{
'mf':mf,'nid':nid})
view.py
    
    {% for row in li %}
  • {
    { row.username }}-{
    { row.user_type.caption }}-编辑
  • {% endfor %}
user_list.html
    
{
{ mf.as_p }}
user_edit.html

 

转载于:https://www.cnblogs.com/Keep-Ambition/p/9769093.html

你可能感兴趣的文章
JavaScript--eval
查看>>
iOS6与iOS7屏幕适配技巧
查看>>
获取视图尺寸大小方法
查看>>
mysql 历史记录查询
查看>>
sqoop连接Oracle数据库错误异常
查看>>
伪类与超链接
查看>>
HTML语言的一些元素(二)
查看>>
一段js代码的分析
查看>>
centos 7 redis-4.0.11 主从
查看>>
Java的基本数据类型与转换
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
【分布计算环境学习笔记】2 分布式系统中的面向对象技术
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
视频:"我是设计师"高清完整版Plus拍摄花絮
查看>>
sicp solutions
查看>>
VALSE2019总结(4)-主题报告
查看>>