返回顶部
首页 > 资讯 > 后端开发 > Python >Django之ModelForm
  • 511
分享到

Django之ModelForm

DjangoModelForm 2023-01-30 23:01:56 511人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

  在前面有篇博客,我写了一个叫fORMs组件的东西,可以帮助我们完成校验数据、渲染标签功能和在前端页面局部刷新功能,功能封装的已经很好了,当时已经很开心了。但万万没想到,还有比它功能更强大的东西。forms组件只能渲染出type=tex

  在前面有篇博客,我写了一个叫fORMs组件的东西,可以帮助我们完成校验数据、渲染标签功能和在前端页面局部刷新功能,功能封装的已经很好了,当时已经很开心了。但万万没想到,还有比它功能更强大的东西。forms组件只能渲染出type=text类型的标签,而且还要我们写无数多个字段,然后跟上校验条件,用forms组件做编辑页面时,还要手动的把编辑的对象的每一个值写入标签的value,这些等等虽然相较没用forms组件之前更方便了,但跟ModelForm比起来,都显得苍白无力,把ModelForm吹了那么久,现在就让我们来见识见识ModelForm的强大。

  不管是用什么,首先都得有模型类吧,创建模型类是没有变化的,这是往库里创建表的必有步骤,肯定是变不的。

  一、创建模型类,完成数据库迁移

  models.py

from Django.db import models

# Create your models here.
class Book(models.Model):
    name=models.CharField(max_length=15,verbose_name='名字')
    price=models.IntegerField(verbose_name='价格')
    pub_date=models.DateTimeField(verbose_name='出版时间')
    publish = models.ForeignKey('Publish', on_delete=models.CASCADE,verbose_name='出版社')
    author=models.ManyToManyField('Author',db_table='book_author',verbose_name='作者')
    class Meta:
        db_table='Book'
        verbose_name='书籍'
    def __str__(self):
        return self.name
class Publish(models.Model):
    name=models.CharField(max_length=15,verbose_name='名字')
    addr=models.CharField(max_length=15,verbose_name='地址')
    phone=models.IntegerField(verbose_name='电话号码')
    class Meta:
        db_table='Publish'
        verbose_name='出版社'
    def __str__(self):
        return self.name
class Author(models.Model):
    name=models.CharField(max_length=15,verbose_name='名字')
    age=models.IntegerField(verbose_name='年龄')
    author_info=models.OneToOneField('Author_Info',on_delete=models.CASCADE,verbose_name='详情')
    class Meta:
        db_table='Author'
        verbose_name='作者'
    def __str__(self):
        return self.name
class Author_Info(models.Model):
    gf_name=models.CharField(max_length=10,verbose_name='女朋友名字')
    telephone=models.IntegerField(verbose_name='电话号码')
    ShenFenZheng=models.IntegerField(verbose_name='身份证号')
    class Meta:
        db_table='Author_Info'
        verbose_name='作者详情'
    def __str__(self):
        return str(self.ShenFenZheng)

  二、创建一个ModelForm类

from djanGo import forms
from  django.forms import widgets as wid
class BookModelForm(forms.ModelForm):
    class Meta:
        model=models.Book             #这相当于给Book模型类创建的
        # fields=["title","price"]
        # exclude = ["title"]
        fields="__all__"             #这是要校验的字段,现在表示所有字段校验,上面两种写法也可以。

        widgets={
            "name":wid.TextInput(attrs={"class":"form-control"}),
            "price":wid.TextInput(attrs={"class":"form-control"})
        }                           #这是对用ModelForm生成标签的属性修改
        error_messages={
            "name":{"required":"该字段不能为空"}
        }                          #这是修改错误信息的显示样式
        labels={
            "name":"书籍名称"
        }

    def  clean_title(self):       #也可以定义钩子
        val=self.cleaned_data.get("title")
        if val.startswith("xxx"):
            return val
        else:
            raise  ValidationError("必须以xxx开头!")

  ModelForm校验数据和forms组件是一样,用is_valid()按照校验规则来校验,错误的信息会放在form.errors里面。

  三、渲染标签

  views.py

def addbook(request):
    if request.method=="POST":
        form=BookModelForm(request.POST)
        if form.is_valid():
            form.save()           #当数据校验通过后,我们不用写什么create,只需要写上这一句,就完成在表中创建一条记录。
            return redirect("/books/")
        else:
            return render(request, 'addbook.html', locals())
    else:

        # form=BookForm()   # forms组件
        form=BookModelForm()       #  modelforms组件
        return render(request,'addbook.html',locals())

  add.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/CSS/bootstrap.css">
    <script src="/static/Jquery-3.3.1.js"></script>
    <script src="/static/js/bootstrap.js"></script>
    <style>
        .outer{
            margin-top: 200px;
        }
        .title{
            margin-bottom: 50px;
        }
        ul{
            list-style: none;
            margin: 0;
            padding: 0;
        }
        .left{
            position: fixed;
            left: 0;
            top: 20px;
        }
    </style>
</head>
<body>
    <div class="left">
        <div class="panel panel-primary">
            <div class="panel-heading">
                <h3 class="panel-title">操作栏</h3>
            </div>
            <div class="panel-body">
                <div>
                    <a href="{% url 'app01_publish_add' %}?next={{ url }}" class="">添加出版社</a>
                </div>
                <div>
                    <a href="" class="">添加作者</a>
                </div>
            </div>
        </div>
    </div>
    <div class="container outer">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div style="color: blue;font-size: 50px;text-align: center;font-family: 华文隶书" class="title">添加{{ zw_name }}</div>
                <form action="" method="post" novalidate>
                    {% csrf_token %}
                    {% for field in form %}
                        <div class="form-group ">
                            <label for="id_{{ field.name }}">{{ field.label }}</label>
                            {{ field }}<span style="color: red">{{field.errors }}</span>
                        </div>
                    {% endfor %}
                    <button class="submit btn btn-info pull-right">提交</button>
                </form>
            </div>
        </div>
    </div>
    <script>
    $('input,select').addClass('form-control');
    </script>
</body>
</html>

  其实从代码层面上讲,做add校验和标签渲染没多大区别,但在前端页面上看是有区别的,forms组件只能渲染成type=text的input标签,多于一对多和多对多的字段就无能为力了,还得自己去写。但ModelForm就不一样了,它会把你的一对多的字段渲染成单选的select标签,把多对多的字段渲染成多选的select标签,这样就相当方便了。如下图:

  ModelForm可以渲染select标签,它在编辑页面还有更强大的功能,你只需把一个模型类的对象传给他,他就可以帮你把对象每个值取出来,然后赋予标签的value,在更新数据时也不用写update了,用save()就搞定了。这就解决了我们要手动的去把要编辑的对象每个字段的值取出来放入标签中。

  views.py

def editbook(request,edit_book_id):
    edit_book = models.Book.objects.filter(pk=edit_book_id).first()
    if request.method=="POST":
        form = BookModelForm(request.POST,instance=edit_book)
        if form.is_valid():
            form.save()       #在这里用save()的前提是校验的时候你把要编辑的对象传给ModelForm的instance参数了,不然就相当于重新创建一条表记录
            return redirect("/books/")
        else:
            return render(request, 'editbook.html', locals())
    else:
        form=BookModelForm(instance=edit_book)     #要把编辑的对象传给ModelForm的instance参数
        return render(request,'editbook.html',locals())

  edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
    <script src="/static/jquery-3.3.1.js"></script>
    <script src="/static/js/bootstrap.js"></script>
    <style>
        .outer{
            margin-top: 200px;
        }
        .title{
            margin-bottom: 50px;
        }
        ul{
            list-style: none;
            margin: 0;
            padding: 0;
        }
        .left{
            position: fixed;
            left: 0;
            top: 20px;
        }
    </style>
</head>
<body>
    <div class="left">
        <div class="panel panel-primary">
            <div class="panel-heading">
                <h3 class="panel-title">操作栏</h3>
            </div>
            <div class="panel-body">
                <div>
                    <a href="{% url 'app01_publish_add' %}?next={{ url }}" class="">添加出版社</a>
                </div>
                <div>
                    <a href="" class="">添加作者</a>
                </div>
            </div>
        </div>
    </div>
    <div class="container outer">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div style="color: blue;font-size: 50px;text-align: center;font-family: 华文隶书" class="title">编辑{{ zw_name }}</div>
                <form action="" method="post" novalidate>
                    {% csrf_token %}
                    {% for field in form %}
                        <div class="form-group ">
                            <label for="id_{{ field.name }}">{{ field.label }}</label>
                            {{ field }}<span style="color: red">{{field.errors }}</span>
                        </div>
                    {% endfor %}
                    <button class="submit btn btn-info pull-right">提交</button>
                </form>
            </div>
        </div>
    </div>
    <script>
    $('input,select').addClass('form-control');
    </script>
</body>
</html>

 

  结果:

 

   总之啊,ModelForm是相当的好用,一直以来,我的叫法应该都有问题,我一直把forms组件下的Form叫成forms组件,之前写的Form和今天写的ModelForm都属于forms组件,大家请原谅我。

--结束END--

本文标题: Django之ModelForm

本文链接: https://lsjlt.com/news/180827.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django之ModelForm
      在前面有篇博客,我写了一个叫forms组件的东西,可以帮助我们完成校验数据、渲染标签功能和在前端页面局部刷新功能,功能封装的已经很好了,当时已经很开心了。但万万没想到,还有比它功能更强大的东西。forms组件只能渲染出type=tex...
    99+
    2023-01-30
    Django ModelForm
  • django中模板继承与ModelForm怎么用
    这篇文章主要讲解了“django中模板继承与ModelForm怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“django中模板继承与ModelForm怎么用”吧!模板的继承完美在写ht...
    99+
    2023-06-30
  • django中模板继承与ModelForm实例详解
    目录模板的继承form和ModelForm使用方法总结模板的继承 完美在写html的时候会发现,自己多个html文件中又好多东西是一样的,包括静插件的引入 还有有些简单的css样式都...
    99+
    2024-04-02
  • Django中ModelForm组件的简单配置与使用教程
    目录1、前言2、简单配置3、创建模板文件,使用ModelForm组件补充:django中的modelform快速上手后言1、前言 hello大家好,今天学习了modelform组件,...
    99+
    2024-04-02
  • Form和ModelForm组件
    Form介绍  我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如...
    99+
    2023-01-31
    组件 Form ModelForm
  • Django之 HelloWorld
    C:\Users\andy>django-admin startproject sundyblog   ## 创建项目     C:\Users\andy>cd sundyblog2、C:...
    99+
    2023-06-05
  • Django之content_type
    什么是content type:django内置的一个组件,这个组件帮忙做连表的操作。(混搭连表) 适用场景:适用于一张表与多张表同时做关联的时候。直接导入就可以使用了。 关联数据库说有的表;让我们可以快速插入数据,并且用反向查找能快速查...
    99+
    2023-01-30
    Django content_type
  • Django之ORM
    ORM即Object Relational Mapping(对象关系映射)对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编...
    99+
    2023-01-30
    Django ORM
  • Django之Template
    Template模板的使用帮助我们将数据对应的插入到html文档中显示给用户。 一.Template和Context对象 t = Template('My name is {{ name }}.') c = Context({'n...
    99+
    2023-01-30
    Django Template
  • Django之FBV&CBV
    CBV与FBV是django视图中处理请求的两种方式 FBV也就是function base views,字面意思函数基础视图,使用函数的方式处理请求url分发中添加的参数为视图处理函数名, path('login/',views.l...
    99+
    2023-01-30
    Django FBV CBV
  • Django之forms组件
      一、校验数据功能   我们在写注册页面时,之前只是提交了数据,然后就保存了数据,后端根本就没有对数据进行校验,比如价格写的不是纯数字也让保存,这肯定是不行的,在前端是可以校验的,但我们不能只依靠前端验证,万一前端不校验,那整个过程就没...
    99+
    2023-01-30
    组件 Django forms
  • Django之Form组件
    一 Form介绍      我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。   与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度...
    99+
    2023-01-30
    组件 Django Form
  • Django之视图层
      一、视图函数   一个视图函数,简称视图,是一个简单的python函数,接收web请求并返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误等。在函数中必须写一个request的参数,然后必须要有返回值,中间的...
    99+
    2023-01-30
    视图 Django
  • Django之模板层
      在一个项目里面有一个专门放模板的文件夹Templates,有一个专门放视图的文件views,而且我们大多给浏览器响应的都应该是一个完整的页面,也就是读取的是一个HTML文件,然后再返回给浏览器。但我们在写HTML文件时,里面关于要从数...
    99+
    2023-01-30
    模板 Django
  • Django之auth组件
    一、Auth模块是什么   django内置的用户认证系统 ,可以快速 的实现,登录,注销,修改密码... 二、Auth用法:   1、先创建超级用户 :      python3 manage.py createsuperuser; ...
    99+
    2023-01-30
    组件 Django auth
  • Django之中间件
    中间件介绍   中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。   但是由于其影响的是全局,所以需要谨慎使...
    99+
    2023-01-30
    中间件 Django
  • Django之Cookie和Sessio
    Cookie cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 一句有...
    99+
    2023-01-30
    Django Cookie Sessio
  • Django之路由层
      url配置就像Django所支撑网站的目录。它的本质是url与要被该url调用的视图函数之间的映射表;通过这个映射表可以告知Django,对于客户端发来的某个url该执行那些代码。   一、简单的路由配置 from django.u...
    99+
    2023-01-30
    路由 Django
  • 浅谈Python之Django
    目录工具版本创建工程djangostart创建项目message创建一些辅助目录连接数据库(保证自己的数据库已启动)生成数据表总结工具版本 python版本:3.8 djang...
    99+
    2024-04-02
  • Django学习之十: staticfi
    目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方...
    99+
    2023-01-30
    Django staticfi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作