通过ModelForm实现主机添加和编辑
通过ModelForm实现主机添加和编辑
    ModelForm这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来;在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义
ModelForm案例:GitHub地址
https://github.com/baolin2200/modelform
依赖模块:
```python
from django.forms import ModelForm
```
###部分注释文件
#### 定义 forms.py
```python
from django.forms import Form
# widgets 表示插件 由于和 ModelForm 得 widgets 相冲突所以 as 重命名
from django.forms import widgets as widgets_bash
# fields 表示所有的字段
from django.forms import fields
# 依赖模块ModelForm
from django.forms import ModelForm
# 导入 models 表结构
from app01 import models
使用Form实现 用户登陆的数据清洗
class LoginForm(Form):
username = fields.CharField(
# 定义模板端获取得 名称 展示的汉字
label="用户名",
required=True,       # 表示不能为空,默认不可为空
error_messages={     # 错误信息 依照中文形式显示
"required": "用户名不能为空",       # required 为真是错误信息
},
# 插件类型TextInput(attrs={"class": "自定义属性 多个依照空格分隔 form-control 为bootcss属性"})
widget=widgets_bash.TextInput(attrs={"class": "form-control xxx aaa"})
)
password = fields.CharField(
    label="密码",
    required=True,       # 表示不能为空,默认不可为空
    error_messages={     # 错误信息 依照中文形式显示
        "required": "密码不能为空",       # required 为真是错误信息
    },
    widget=widgets_bash.PasswordInput(attrs={"class": "form-control"})
)
# 可以定义钩子函数
# def clean_username(self):
#     pass
使用 ModelForm 实现 主机添加 编辑的数据清洗
class HostModelForm(ModelForm):
class Meta:
# 指定数据库的哪张表
model = models.Host
    # 指 表中的哪个字段 "__all__" 表示所有的字段
    fields = "__all__"
    # 表示获取指 定的字段
    # fields = ["hostname", "ip"]
    # 用与 labels 调用
    labels = {
        "ip": "IP",
        "hostname": "主机名",
        "port": "端口",
        "dp": "部门",
        "user": "用户",
    }
    # 用于错误信息调用
    error_messages = {
        "ip": {"required": "IP不能为空",},
        "hostname": {"required": "用户名不能为空", },
    }
    # 定义样式
    widgets = {
        "ip": widgets_bash.TextInput(attrs={"class": "form-control"}),
        "hostname": widgets_bash.TextInput(attrs={"class": "form-control"}),
        "port": widgets_bash.TextInput(attrs={"class": "form-control xxx aaa"}),
    }
# 定义 钩子 清洗 hostname 内容
def clean_hostname(self):
    from django.core.exceptions import ValidationError
    hostname = self.cleaned_data['hostname']
    obj = models.Host.objects.filter(hostname=hostname)
    print("clean_hostname=========", obj)
    if obj:
        # 抛出 错误异常
        raise ValidationError('主机名已存在')
    return hostname
####models表结构
```python
from django.db import models
# Create your models here.
class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    def __str__(self):
        return self.username
# 部门表
class Departement(models.Model):
    title = models.CharField(max_length=32)
    def __str__(self):
        return self.title
# 主机表
class Host(models.Model):
    # blank=True 表示可以为空
    hostname = models.CharField(max_length=32)
    # GenericIPAddressField 与 model form 一起使用才有效果,否则和 CharField效果一样
    # ip = models.GenericIPAddressField(protocol="ipv4")
    ip = models.CharField(max_length=32)
    port = models.IntegerField()
    # 一对多 1个用户多个 主机
    user = models.ForeignKey(to="UserInfo", default=1)
    # 多对多 主机表 和 部门表
    dp = models.ManyToManyField(to="Departement")
定义views.py文件
from django.shortcuts import render, redirect, HttpResponse
# Create your views here.
from app01.forms import LoginForm, HostModelForm
from app01 import models
from django.conf import settings    # 用户自定义 + 内置的 settings 配置文件
from utils.md5 import md5           # utils 为自定义工具 包
from utils.pager import Pagination  # 导入 自定义的 分页模块
def login(request):
    if request.method == "GET":
        form = LoginForm()
        return render(request, "login.html", {"form": form})
    else:
        # 将接收到的数据,传给LoginForm()类 通过form 验证;
        form = LoginForm(request.POST)
        # 通过 form 验证后,form 为True
        if form.is_valid():
            # 通过form验证的数据 存放在 cleaned_data 中
            # form.cleaned_data
            form.cleaned_data["password"] = md5(form.cleaned_data["password"])
            # 通过 **form.cleaned_data 可以将 数据依照字典形式获取 filter({"username":zhangsan,"password":1234})
            userinfo = models.UserInfo.objects.filter(**form.cleaned_data).first()  # 拿取第一个对象值
            # 如果userinfo 中有数据,即表示验证成功
            if userinfo:
                # 将 用户信息 放置到 session 中
                request.session[settings.USER_SESSION_KEY] = {"id": userinfo.pk, "username": userinfo.username}
                # 重定向 页面
                return redirect("/index/")
            else:
                # 用户验证失败
                form.add_error("password", "用户名或密码错误")
        # 存放错误信息 form.errors
        # 将 form 清洗过的 数据直接返回给 html 模板
        return render(request, "login.html", {"form": form})
def index(request):
    # return HttpResponse("验证成功!")
    return render(request, "index.html")
def testt(request):
    user = models.UserInfo.objects.filter(username="baolin")
    print(user.username)
    return HttpResponse("OK")
def host(request):
    # 统计出一共有多少条 数据
    all_count = models.Host.objects.all().count()
    # page_obj = Pagination 方法需要 3个 参数(请求当前页码,总数据条数,该应用路径)
    # page_obj = Pagination(request.GET.get('page'),all_count,'/host/')
    page_obj = Pagination(request.GET.get('page'),all_count,request.path_info)
    # host_list = models.Host.objects.all()[本页内容的开始,本页内容的结束]
    host_list = models.Host.objects.all()[page_obj.start:page_obj.end]
    # render(request, 页面, {展示内容,展示的 html页码})
    return render(request, 'host.html', {'host_list': host_list, 'page_html': page_obj.page_html()})
def add_host(request):
    if request.method == "GET":
        form = HostModelForm()
        return render(request, "add_host.html", {"form": form})
    else:
        # 将模板传入的数据 交给 HostModelForm() 清洗
        form = HostModelForm(data=request.POST)
        if form.is_valid():
            print(form.cleaned_data)
            # form.save() 将通过 ModelForm 清洗的 数据直接保存到数据库中
            obj = form.save()
            return redirect("/host/")
        return render(request, "add_host.html", {"form": form})
def edit_host(request, nid):
    obj = models.Host.objects.filter(id=nid).first()
    if not obj:
        return HttpResponse("数据不存在!")
    if request.method == "GET":
        # 将 要修改的数据对象,传给 HostModelForm() 进行清洗
        form = HostModelForm(instance=obj)
        return render(request, "edit_host.html", {"form": form})
    else:
        # 如果是 post 提交,将数据传给 HostModelForm() 清洗,并指定是 instance 的对象值
        form = HostModelForm(data=request.POST, instance=obj)
        if form.is_valid():
            form.save()
            return redirect("/host/")
        return render(request, "edit_host.html", {"form": form})
通过ModelForm实现主机添加和编辑的更多相关文章
- Xadmin添加,编辑,删除
		Xadmin添加,编辑,删除 1.HTML 编辑和添加页面得内容相同,使用include将他们整合 {% include xxx.html %} 获取指定页面的所有内容 1.单独建个html存放编辑和 ... 
- 阿里云云主机添加swap分区与swap性能优化
		1.swap的功能与相应内核参数 Linux 将物理内存分为内存段的部分被称作“页面”.交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存.物理内存和交换空间 ... 
- 巨蟒django之CRM3 添加和编辑客户&&公户和私户的展示和转换
		昨日内容回顾: day66 1. 内容回顾 1. 数据的展示 数据通过ORM查询出来 对象列表 QuerySet 1. 普通的字段 对象.字段名 ——> 数据库中的值 2. choices (( ... 
- Linux 用户名、主机添加背景色
		文章参考:PS1应用之——修改linux终端命令行各字体颜色 Linux 用户名.主机添加背景色,用于生产环境,这样可以减少人为的误操作. [root@zhang ~]# tail /etc/bash ... 
- [App Store Connect帮助]二、 添加、编辑和删除用户(3)添加和编辑用户
		您可以在“用户和访问”中添加和编辑用户. 如果您以个人名义在“Apple 开发者计划”注册,您可以授权用户访问您 App Store Connect 中的内容.所有用户只拥有 App Store Co ... 
- 通过编写串口助手工具学习MFC过程——(六)添加Edit编辑框控件
		通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ... 
- ant-design-vue中实现modal模态框的复用(添加,编辑展示同一个模态框)
		用两个button(添加,编辑)按钮展示同一个模态框,并不是什么大问题,问题在于解决这两个模态框得有自己的确定和取消方法 父页面完全接管子页面(利于子页面复用) 父页面代码: <template ... 
- 微课制作软件Camtasia中如何添加并编辑字幕?
		除了能录制视频以外,Camtasia还能直接把录制下来的视频进行剪辑,并添加视频字幕等等一些后期效果.今天我们就来看一看字幕的添加方法. 导入视频 微课制作软件Camtasia录制的视频,默认在软件& ... 
- crm 添加用户 编辑用户 公户和私户的展示,公户和私户的转化
		1.添加用户 和编辑可以写在一起 urls.py url(r'^customer_add/', customer.customer_change, name='customer_add'), url( ... 
随机推荐
- Winform调用百度地图接口简单示例
			1.首先用一个html文件调用百度地图接口(主要注册一个序列号): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ... 
- U3D虚拟摇杆制作
			来自https://www.cnblogs.com/jiuxuan/p/7453762.html 1.创建两个Image,修改第一个Image名称为 Background,把第二个Image放入 Ba ... 
- struts2框架学习之第一天
			day01 Struts2概述 1 什么是框架 试想一下,人与人之间不同之处多,还是相同之处多呢?当然是相同之处多,不同之处少!人都有头,而且头都在脖子上面! 软件之间也是相同之处多,不同之处少,框架 ... 
- 毫秒倒计时小Demo
			Demo截图: Demo:Demo 上代码: <!DOCTYPE html> <html lang="en"> <head> <meta ... 
- ansible和python的zabbix_api批量添加rsync服务的监控
			一.正常的处理流程: 1.添加zabbix用户对rsync程序的sudo权限,且不需要输入密码 # visudo即在/etc/sudoers配置文件最后添加如下内容 Defaults:zabbix ! ... 
- nginx https配置记录
			一.证书生成: 要有两个文件,一个私钥,一个证书. 私钥:-----BEGIN PRIVATE KEY----- 开始 证书:-----BEGIN CERTIFICATE----- 开始 二.Ngin ... 
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
			这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ... 
- easyui的combobox,自动搜索的下拉框
			作者:多来哈米 如图,输入关键字,左匹配检索 HTML代码 <input class="easyui-combobox" name="userId" id ... 
- leetcode(js)算法89之格雷编码
			格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头 示例 1: 输入: 2 输出: [ ... 
- javaScript遍历对象、数组总结
			javaScript遍历对象总结 1.使用Object.keys()遍历 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性). var obj = {'0':'a ... 
