• Django学习-23-ModelForm


    Model + Form ----> 验证 + 数据库操作
    class UserInfo(models.Model):
        username = models.CharField(max_length=32,verbose_name='用户名')
        email = models.EmailField(verbose_name='密码')
        user_type = models.ForeignKey(to='User_type',to_field='id',verbose_name='类型')
    
    from django import forms
    from django.forms import fileds as Ffields
    from django.forms import widgets as Fwidgets   *
    class UserInfoModelForm(forms.ModelForm):
        class Meta:
            model = models.UserInfo
            fields = '__all__'                   #生成所有的字段标签
            #fields = ['username','email']       #生成列表字段的标签
            #exclude = ['email']                 #生成除了列表字段的标签
    Meta中的参数
            labels = {
                'username':'xxx',
                'email':'邮箱',
            }
            help_texts={                     # 帮助提示信息
                'username':'这里填写用户名',
            }
            widgets={                        # 自定义插件,widgets为关键字不能改变,导包时要起别名
                'usernmae':Fwidgets.Textarea(attrs={'k':'v'}),
            }
            error_messages={             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
                '__all__':{
                    ...
                }
                'username':{
                    'required':'用户名不能为空',
                    'invalid':'用户名不合法'
                }
            }
            field_classes={               # 自定义字段类 (也可以自定义字段)
                'email':Ffields.URLField   #使用form中的类,因为关键字重复,导包时也要起别名
            }
            localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据 UTC --> 东八区时间
            如:
                数据库中
                    2016-12-27 04:10:57
                setting中的配置
                    TIME_ZONE = 'Asia/Shanghai'
                    USE_TZ = True
                则显示:
                    2016-12-27 12:10:57

    钩子与(Form一样):
    def clean_username(self):
        old = self.cleaned_data['username']
        return old
        #每个字段验证成功之后,可以追加操作

    ModelForm额外字段:

    例子:一个月免登录,这个字段不用做验证
    class UserInfoModelForm(forms.ModelForm):
      
    is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())
       class Meta: 
    model
    = models.UserInfo

    函数处理:
        def user_edit(request, nid):
            # 获取当前id对象的用户信息
            # 显示用户已经存在数据
            if request.method == "GET":
                user_obj = models.UserInfo.objects.filter(id=nid).first()
                mf = UserInfoModelForm(instance=user_obj)
                return render(request,'user_edit.html',{'mf': mf, 'nid': nid})
            elif request.method == 'POST':
                user_obj = models.UserInfo.objects.filter(id=nid).first()
                mf = UserInfoModelForm(request.POST,instance=user_obj)
                #更新操作需要添加instance参数,创建新数据不需要添加
                 if mf.is_valid():
                    # obj.save()        拆分save操作↓↓↓↓↓↓
                    instance = mf.save(False)  #让save操作失效
                    instance.save()             #保存当前类
                    mf.save_m2m()              #保存多对多中间关联表
                else:
                    print(mf.errors.as_json())
                return render(request,'user_edit.html',{'mf': mf, 'nid': nid})
    继承
      Form -> BaseForm
      UserInfoModelForm -> ModelForm -> BaseModelForm -> BaseForm
    BaseForm 中定义了is_valid()、cleaned_data、errors方法
    验证方法和Form一样

  • 相关阅读:
    用最有效率的方法计算2乘以8?
    Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
    swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
    解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
    &和&&的区别?
    int和Integer有什么区别?
    Java有没有goto?
    collect diff() 方法
    contains() 指定集合中是否含有此项目
    collect集合实例方法 将多个数组组成的集合合成单个一维数组集合-- collapse
  • 原文地址:https://www.cnblogs.com/cq146637/p/7828549.html
走看看 - 开发者的网上家园