• django框架ModelForm组件用法详解


    本文实例讲述了django框架ModelForm组件用法。分享给大家供大家参考,具体如下:

    ModelForm组件是django中一个非常强大的组件,其功能主要有

    一 校验字段

    ModelForm组件的主要格式为:

    继承组件

    1

    2

    from django import forms

    class UserModelForm(forms.ModelForm):

    指定表

    1

    model = models.UserInfo

    指定要显示的字段

    1

    fields='__all__'  #显示所有,常用的方式

    或者

    1

    exclude=['password'] #排除某个字段

    或者

    1

    fields=['username','password','confirm_password','email','gender','depart'] #此表中的字段决定了页面显示的排列顺序

    插件:指定属性或者设置字段类型

    1

    2

    3

    4

    5

    6

    7

    widgets = {

         'username': forms.TextInput(attrs={'class': 'form-control', 'placeholder': '用户名'}),

         'password': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': '密码'}),

         'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': '邮箱'}),

         'gender': forms.Select(attrs={'class': 'form-control'}),

         'depart': forms.Select(attrs={'class': 'form-control'}),

       }

    定制错误信息

    1

    2

    3

    4

    5

    6

    error_messages = {

      'email':{

        'required':'邮箱不能为空',

        'invalid':'邮箱格式错误',

      }

    }

    设置显示的标签名称:

    1

    labels={"username":"用户名","password":"密码"}

    设置钩子函数

    1

    def clean_confirm_password(self): #'clean_'加上字段名 这里先使用局部钩子

    当设置了一个字段的钩子函数时,最后必须要返回这个字段

    1

    return confirm

    在函数中使用

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    def user_add(request):

      if request.method == 'GET':

        form = UserModelForm() #最开始访问的时候是没有数据的

        return render(request, 'user_form.html', {'form':form})

      form = UserModelForm(data=request.POST) #传入数据

      if form.is_valid(): #进行校验

        print(form.cleaned_data)

    # form.save的另一种写法
    # Employee.objects.create(name=user.cleaned_data['name'],
    #                              age=user.cleaned_data["age"],
    #                              gender=user.cleaned_data['gender'],
    #                              salary=user.cleaned_data['salary'],
    #                              department=user.cleaned_data['department'])

        form.save()

        return redirect('/crm/user/list/')

      return render(request, 'user_form.html', {'form': form})

    区分 form.cleaned_data和form. errors

    1  ModelForm组件对数据进行校验的时候,对于校验不合格的数据放入 form.errors
    2  那么他们到底都长什么样子呢

    1

    2

    3

    4

    #print(form.cleaned_data)

    {'username': 'lu5', 'password': '123', 'gender': 1, 'depart': -1>}

    #print(form.errors)

      class="errorlist">
    • confirm_password
        class="errorlist">
      • 两次密码输入不一致,请重新输入</li></ul></li>
      • email
          class="errorlist">
        • 邮箱格式错误</li></ul></li></ul>

    一 校验字段

    下面一个例子:校验用户的信息,并且确认用户的密码

    需要对原有数据进行编辑时,需要加入instance参数例如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    def user_edit(request,nid):

      obj = models.UserInfo.objects.filter(id=nid).first()

      if request.method == 'GET':

        form = UserModelForm(instance=obj) #注意此处

        return render(request, 'user_form.html', {'form':form})

      form = UserModelForm(data=request.POST,instance=obj) #注意此处

      if form.is_valid():

        form.save()

        return redirect('/crm/user/list/')

      return render(request, 'user_form.html', {'form': form})

    另外:

    django本身就有对字段检测的功能,只不过单纯的是对空的判断,一般显示的错误信息是英文,我们要显示为中文呢,怎么处理

    1

    2

    LANGUAGE_CODE = 'zh-hans'

    # LANGUAGE_CODE = 'en-us'

    另外如果在模型中存在选项,在前端页面需要显示对应选项内容,而不是显示在数据库的ID时:

    gender_list = (
        (1, '男'),
        (2, '女'),
    )
    gender = models.IntegerField(choices=gender_list)
     
    {% for v in data %}
       

    {{ v.get_gender_display }}


    {% endfor %}
     

    希望本文所述对大家基于Django框架的Python程序设计有所帮助。

  • 相关阅读:
    JVM运行时数据区——程序计数器
    windows进程管理相关命令
    基于若依系统开发一套自己的移动端的框架
    leetcode栈和队列
    第七讲:利用类事件改变对象的属性(上)
    安全协议内涵
    学习网络编程No.9【应用层协议之HTTPS】
    百度给创新员工发2000w奖金........
    10.1作业
    golang 切片结构体多条件排序
  • 原文地址:https://blog.csdn.net/brave_heart_lxl/article/details/127094677