django中的modelform快速上手

10 篇文章 1 订阅
3 篇文章 0 订阅

 

modelform的特点

modelform是django中基于已有的model,快速生成的具有form功能的一个模块,有以下几个特点:

1.  快速:只要告诉类对应哪个model,会根据model表中的字段,自动进行配置。不需要像form那样手动逐条定义每个字段
2. 灵活:可以只选择model表中部分的字段,使用feilds=[,]或者exclude=[,],或者"__all__"表示所有字段
3. 可以自定义添加字段
4. 可以自定义错误信息
5. 可以自定义参数(控制样式等)
6. 利用自带的组件进行字段校验

modelform的使用

1. 创建model表

# app01/models.py

from django.db import models


class UserInfo(models.Model):
    """
    用户信息表
    """
    user = models.CharField(verbose_name='用户名', max_length=32, db_index=True)  # db_index表示为字段增加索引
    password = models.CharField(verbose_name="密码", max_length=32)
    email = models.EmailField(verbose_name='邮箱', max_length=64)
    phone = models.CharField(verbose_name='手机号', max_length=16)

2. 基于model创建modelform

# app01/forms.py

from django import forms
from app01 import models


class RegisterModelForm(forms.ModelForm):
    
    class Meta:
        model = models.UserInfo # 基于的model表名
        fields = '__all__' # 表示自动渲染所有字段

3. 通过视图函数将modelform实例化,并传递给前端

# app01/views.py

from django.shortcuts import render,
from app01.forms import RegisterModelForm

def register(request):
    if request.method == 'GET':
        form = RegisterModelForm() # 实例化modelform
        return render(request, 'register.html', {'form': form}) # 将实例化对象传递给前端

4. 前端使用for循环快速渲染form表单

  • form对象中的每个field代表每个字段的input框 
  • field.label对应的是model表中的verbose_name,如UserInfo表中user字段的verbose_name:'用户名'
  • field.id_for_label 对应的是渲染中,为label标签链接input框指定的属性
  • field.errors表示返回form表单验证的错误信息。注意: 错误信息返回的是元组,需要用field.errors.0
# register.html

...
        <form id="regform" method="post" class="form-group" novalidate>
            {% csrf_token %}
            {% for field in form %} <!--field代表每个字段的input框--> 
               <div class="form-group">
                    <label class='control-label' for="{{ field.id_for_label }}">{{ field.label }}</label>
                    <div>
                        {{ field }}<span class="error-msg">{{ field.errors.0 }}</span>
                    </div>
                </div>
            {% endfor %}
                <input id="btnsumbit" type="button" class="btn-primary btn" value="注 册">
            </div>
        </form>
...

5. 前端接收用户提交的post请求,进行校验和保存数据

  • 通过 form = RegisterModelForm(data=request.POST) 接收用户提交的数据
  • 通过 form.is_valid() 进行校验
  • 通过 form.save()  保存数据
  • 如果没通过校验,返回当前页面及当前的form对象,其包含错误信息
def register(request):
    if request.method == 'GET':
        form = RegisterModelForm()
        return render(request, 'register.html', {'form': form})
    
    # POST请求
    form = RegisterModelForm(data=request.POST)
    if form.is_valid():
   
        user_obj = form.save() 
        return redirect(reverse('login'))  
    return render(request, "register.html", {'form': form}) # 包含错误信息

 

modelform自定义添加字段

在上面的简单注册form表单中,通常需要有给用户输入的确认密码的字段框,但是在用户表中又不需要这个字段,modelform其实支持自定义添加molde中没有的字段

# app01/forms.py

from django import forms
from app01 import models


class RegisterModelForm(forms.ModelForm):
    
    # 自定义添加字段
    confirm_password = forms.CharField(label='确认密码', widget=forms.PasswordInput)

    class Meta:
        model = models.UserInfo # 基于的model表名
        fields = '__all__' # 表示自动渲染所有字段

modelform 自定义显示部分字段

  • fields = '__all__'   表示自动渲染所有字段
  • fields = [’user‘,’password‘,’email‘]  表示仅渲染列表中的字段
  • exclude = [’phone‘]  表示排除列表中的字段,效果同上 
# app01/forms.py

from django import forms
from app01 import models


class RegisterModelForm(forms.ModelForm):
    
    class Meta:
        model = models.UserInfo # 基于的model表名
        fields = [’user‘,’password‘,’email‘] # 表示仅渲染列表中的字段
        # exclude = [’phone‘] # 表示排除列表中的字段,效果同上 

 

modelform 自定义错误信息

modelform有自动校验错误并返回错误信息的功能,如果不想用自带的错误信息的内容,可以利用modelform中的error_messages 属性进行自定义

class RegisterModelForm(forms.ModelForm):
    
    class Meta:
        ...
        error_messages = { # 自定义错误信息
            'user':{
                'required': ('角色名称不能为空'),
            
            },
            ’字段名’:{
                ‘错误情况1’:(’错误信息1‘),
                ...
            },
            ...
        }

modelform 自定义参数(样式)

比如想要让password在输入框中以密文形式显示,则可以自定义参数

class RegisterModelForm(forms.ModelForm):
    
    # 自定义添加字段参数(方式一)
    confirm_password = forms.CharField(label='确认密码', widget=forms.PasswordInput)
    
    class Meta:
        ...
        widgets = { # 自定义标签参数(方式二)
            'password': forms.PasswordInput(attrs={'class': 'form-control'})
        }

 

至此,关于django中的modelform基本使用介绍完毕,另外关于modelform的其他一些常用方法,比如局部验证,未输入字段的保存等,后续会在单独的文章中介绍。

如文章中有错误,欢迎指正

 

 

 

 

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值