Django之ModelForm组件的配置 具体使用的注意事项

鳄鱼君Ba

发表文章数:518

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Django之ModelForm组件的配置 具体使用的注意事项
ModelForm
1.  class Meta:
        model,                           # 对应Model的
        fields=None,                     # 字段
        exclude=None,                    # 排除字段
        labels=None,                     # 提示信息
        help_texts=None,                 # 帮助提示信息
        widgets=None,                    # 自定义插件
        error_messages=None,             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
        field_classes=None               # 自定义字段类 (也可以自定义字段)
        localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
        如:
            数据库中
                2016-12-27 04:10:57
            setting中的配置
                TIME_ZONE = 'Asia/Shanghai'
                USE_TZ = True
            则显示:
                2016-12-27 12:10:57
2. 验证执行过程
    is_valid -> full_clean -> 钩子 -> 整体错误

3. 字典字段验证
    def clean_字段名(self):
        # 可以抛出异常
        # from django.core.exceptions import ValidationError
        return "新值"
4. 用于验证
    model_form_obj = XXOOModelForm()
    model_form_obj.is_valid()
    model_form_obj.errors.as_json()
    model_form_obj.clean()
    model_form_obj.cleaned_data
5. 用于创建
    model_form_obj = XXOOModelForm(request.POST)
    #### 页面显示,并提交 #####
    # 默认保存多对多
        obj = form.save(commit=True)
    # 不做任何操作,内部定义 save_m2m(用于保存多对多)
        obj = form.save(commit=False)
        obj.save()      # 保存单表信息
        obj.save_m2m()  # 保存关联多对多信息

6. 用于更新和初始化
    obj = model.tb.objects.get(id=1)
    model_form_obj = XXOOModelForm(request.POST,instance=obj)
    ...

    PS: 单纯初始化
        model_form_obj = XXOOModelForm(initial={...})

我们还是按照前一篇文章,现在来添加一些参数,让页面信息更加完善:

from django.forms import ModelForm
from django.forms import widgets as wg
class UserModelForm(ModelForm):
    class Meta:
        model=models.UserInfo  #定位到models的UserInfo类中的字段
        fields='__all__' #所有的字段
        labels={  #左侧提示信息
            "username":"用户名",
            "email":"邮箱",
            "user_city":"城市",
        }
        widgets={  #定制多行文本插件 并配置class样式
            "username":wg.Textarea(attrs={'class':'a1'})
        }

对于错误信息也可以使用error_messages来定义,默认在在浏览器会加上required,如果你什么都不输入就会提示,你可以把它去掉,方便我们查看错误提示的信息。如果什么都不输入在页面中会显示This field is required.,在后台打印obj.errors会输出:

{"username": [{"message": "This field is required.", "code": "required"}], 
"email": [{"message": "This field is required.", "code": "required"}]}

都是英文不适合我们,我们可以来自定义错误信息:

from django.forms import ModelForm
from django.forms import fields as fd
class UserModelForm(ModelForm):
    class Meta:
        model=models.UserInfo  #定位到models的UserInfo类中的字段
        fields='__all__' #所有的字段
        labels={  #左侧提示信息
            "username":"用户名",
            "email":"邮箱",
            "user_city":"城市",
        }
        error_messages={
            # "__all__":{
            #     定义整体的错误信息
            # }
            "username":{
                "required":'用户名不能为空',
            },
            "email":{
                "required": '邮箱不能为空',
                "invalid": '邮箱不合法',
            }
        }
        field_classes={
            "email":fd.URLField  #将邮箱格式转换为网址
        }

如果存在变量名字重复,在导入的时候需要另起别名,像fields和widgets都需要设置别名。那么我们继续往下延伸,如果现在用户信息正确,我们需要把它添加到数据库中,使用modelform非常简单:

def index(request):
    if request.method=="GET":
        obj=UserModelForm()
        return render(request,'index.html',{'obj':obj})
    elif request.method=="POST":
        obj =UserModelForm(request.POST)
        if obj.is_valid():
            obj.save()  #如果用户信息正确,会直接保存到数据库中
        return render(request, 'index.html', {'obj': obj})

现在你填入正确的信息,就会直接保存在数据库中。接着来实现多对多,创建一个用户组UserGroup类:

from django.db import models

class UserGroup(models.Model):
    user_group=models.CharField(max_length=32)

class UserCity(models.Model):
    city=models.CharField(max_length=32)


class UserInfo(models.Model):
    username=models.CharField(max_length=32)
    email=models.EmailField()
    user_city=models.ForeignKey(to='UserCity',to_field='id',on_delete=models.CASCADE)
    u_g=models.ManyToManyField(UserGroup)

重新执行命令,并在数据库中添加一条信息。然后运行程序,会发现多对多的表也显示出来了,那么我们在添加一条信息,然后使用Navicat查看一下数据库中的信息,你会发现多对多的表也会增加信心:

Django之ModelForm组件的配置 具体使用的注意事项

如果现在我不想保存ManyToManyField关联的类,可以使用下面的代码:

def index(request):
    if request.method=="GET":
        obj=UserModelForm()
        return render(request,'index.html',{'obj':obj})
    elif request.method=="POST":
        obj =UserModelForm(request.POST)
        if obj.is_valid():
            #不保存多对多关系表
            instance = obj.save(False)
            instance.save()
            #obj.save()  #等价于下面的三行代码
            # instance = obj.save(False)
            # instance.save()
            # obj.save_m2m()
        return render(request, 'index.html', {'obj': obj})

具体效果自己敲代码查看一下效果。

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Django之ModelForm组件的配置 具体使用的注意事项》 发布于2020-04-27

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

3 + 2 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册