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一样

posted @ 2017-11-13 22:19  前路~  阅读(158)  评论(0编辑  收藏  举报