Django-ModelForm

2024-06-19 23:48
文章标签 django modelform

本文主要是介绍Django-ModelForm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


作者:武沛齐 
出处:Django之ModelForm组件

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

 

ModelForma.  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:57setting中的配置TIME_ZONE = 'Asia/Shanghai'USE_TZ = True则显示:2016-12-27 12:10:57b. 验证执行过程is_valid -> full_clean -> 钩子 -> 整体错误c. 字典字段验证def clean_字段名(self):# 可以抛出异常# from django.core.exceptions import ValidationErrorreturn "新值"d. 用于验证model_form_obj = XXOOModelForm()model_form_obj.is_valid()model_form_obj.errors.as_json()model_form_obj.clean()model_form_obj.cleaned_datae. 用于创建model_form_obj = XXOOModelForm(request.POST)#### 页面显示,并提交 ###### 默认保存多对多obj = form.save(commit=True)# 不做任何操作,内部定义 save_m2m(用于保存多对多)obj = form.save(commit=False)obj.save()      # 保存单表信息obj.save_m2m()  # 保存关联多对多信息
 f. 用于更新和初始化obj = model.tb.objects.get(id=1)model_form_obj = XXOOModelForm(request.POST,instance=obj)...PS: 单纯初始化model_form_obj = XXOOModelForm(initial={...})

 

一个实例:

1. models.py

ContractedBlock.gif ExpandedBlockStart.gif
 1 from django.db import models
 2 
 3 # Create your models here.
 4 
 5 
 6 class UserInfo(models.Model):
 7     name = models.CharField(max_length=32)
 8     email = models.EmailField()
 9     nickName = models.CharField(max_length=32)
10     group = models.ForeignKey('UserGroup', null=True, blank=True)
11     role = models.ManyToManyField('Role', null=True, blank=True)
12 
13     def __str__(self):
14         return self.name
15 
16 
17 class UserGroup(models.Model):
18     name = models.CharField(max_length=32)
19     info = models.TextField()
20 
21     def __str__(self):
22         return self.name
23 
24 
25 class Role(models.Model):
26     name = models.CharField(max_length=32)
27     info = models.TextField()
28 
29     def __str__(self):
30         return self.name
View Code

2. views.py

ContractedBlock.gif ExpandedBlockStart.gif
 1 from django.shortcuts import render,HttpResponse
 2 from django.forms import ModelForm
 3 from django.forms import fields as dfields
 4 from django.forms import widgets as dwidgets
 5 from app01 import models
 6 
 7 
 8 class TestModelForm(ModelForm):
 9     class Meta:
10         model = models.UserInfo
11         fields = '__all__'
12         error_messages = {
13             'name': {
14                 'required': '用户名不能为空',
15             },
16             'email': {
17                 'required': '邮箱不能为空',
18                 'invalid': '邮箱格式不正确',
19             },
20             'nickName': {
21                 'required': '昵称不能为空',
22             }
23         }
24         labels = {
25             'name': '用户名',
26             'email': '邮箱',
27             'nickName': '昵称',
28             'group': '部门',
29             'role': '角色',
30         }
31         widgets = {
32             'name': dwidgets.Input(attrs={'class': 'form-control'}),
33             'email': dwidgets.Input(attrs={'class': 'form-control'}),
34             'nickName': dwidgets.Input(attrs={'class': 'form-control'}),
35             'group': dwidgets.Select(attrs={'class': 'form-control'}),
36             'role': dwidgets.SelectMultiple(attrs={'class': 'form-control'}),
37         }
38 
39 # Create your views here.
40 
41 
42 def test(request):
43     content = {'form': None}
44     if request.method == 'GET':
45         form = TestModelForm()
46         content['form'] = form
47         return render(request, 'test.html', content)
48     else:
49         form = TestModelForm(request.POST)
50         content['form'] = form
51         if form.is_valid():
52             print(form.cleaned_data)
53             form.save()
54             return HttpResponse('add success!')
55         else:
56             return render(request, 'test.html', content)
57 
58 
59 def edit(request, nid):
60     obj = models.UserInfo.objects.filter(id=nid).first()
61     content = {'form': None}
62     if request.method == 'GET':
63         form = TestModelForm(instance=obj)
64         content['form'] = form
65         return render(request, 'edit.html', content)
66     else:
67         form = TestModelForm(instance=obj, data=request.POST, files=request.FILES)
68         if form.is_valid():
69             form.save()
70             return HttpResponse('edit success!')
71         content['form'] = form
72         return render(request, 'test.html', content)
View Code

3. templates

ContractedBlock.gif ExpandedBlockStart.gif
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
 6     <title>Title</title>
 7 </head>
 8 <body>
 9 <form method="post" novalidate>
10     {% csrf_token %}
11     <div class="form-group" style="width: 300px; margin: 50px auto;">
12         {{ form.as_p }}
13         <input type="submit" value="提交">
14     </div>
15 </form>
16 
17 <script src="/static/jquery-3.2.1.js"></script>
18 </body>
19 </html>
test.html
ContractedBlock.gif ExpandedBlockStart.gif
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
 6     <title>Title</title>
 7 </head>
 8 <body>
 9 <form method="post" novalidate>
10     {% csrf_token %}
11     <div class="form-group" style="width: 300px; margin: 50px auto;">
12         {{ form.as_p }}
13         <input type="submit" value="提交">
14     </div>
15 </form>
16 
17 <script src="/static/jquery-3.2.1.js"></script>
18 </body>
19 </html>
edit.html

 

这篇关于Django-ModelForm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076500

相关文章

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

Linux搭建Python3、Django环境

开发十年,就只剩下这套架构体系了! >>>    好久没写了,朋友们,我又回来了。 安装Python3 Python全部版本下载地址:         https://www.python.org/ftp/ 解决RedHat,使用Python3退格出现乱码问题:         yum -y install readline-devel.x86_64 下载Python3:

Django 第十七课 -- 视图 - FBV 与 CBV

目录 一. 前言 二. FBV 三. CBV 一. 前言 FBV(function base views) 基于函数的视图,就是在视图里使用函数处理请求。 CBV(class base views) 基于类的视图,就是在视图里使用类处理请求。 二. FBV 基于函数的视图其实我们前面章节一直在使用,就是使用了函数来处理用户的请求,查看以下实例: 路由配置: urlpat

django摄影竞赛小程序论文源码调试讲解

2系统关键技术及工具简介 系统开发过程中设计的关键技术是系统的核心,而开发工具则会影响的项目开发的进程和效率。第二部分便描述了系统的设计与实现等相关开发工具。 2.1 Python简介 Python 属于一个高层次的脚本语言,以解释性,编译性,互动性和面向对象相结合。在设计上相比其他语言,它更具有特色语法结构,很强的可读性。 2.2 Django框架 Django是一个开放源

Django 测试指南

#Django 测试指南 对绝大部分人来说,测试Django应用感觉很神秘,他们只是听说代码必须要测试,但是经常找不到线索如何入手。当他们看了Django的测试文档,他们找到深入的哪些功能是可用的,但是如果实现没有任何指导。 这是本博客系列的第一篇,尝试帮助大家减轻压力,使得每个人在测试潮流。假设你从来没有做过任何测试,但是对Python&Django很熟悉了。 我们将贯穿添加测试到pere

使用django-simple-captcha遇到的坑

使用django-simple-captcha遇到的坑 一站点gongshare.com在做注册功能时验证码采用的django-simple-captcha,因为笔者开发环境采用的Windows 64bit系统,结果安装使用的时候接二连三遇到好几个坑。 django-simple-captcha需要依赖django1.3+、PIL1.1.7+或者Pillow2.0+,根据文档安装后开始使用时,