通过ModelForm实现主机添加和编辑

通过ModelForm实现主机添加和编辑

    ModelForm这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来;在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义
        

ModelForm案例:GitHub地址
https://github.com/baolin2200/modelform


依赖模块:

from django.forms import ModelForm

部分注释文件

定义 forms.py
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表结构
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})

转载于:https://www.cnblogs.com/baolin2200/p/8193827.html

考试题目利用本学期所学内容完成一个《健身俱乐部会员管理系统》,近年来随着人们对健康生活方式地追求,健身会员管理行业呈现快速增长态势,如何提高会员忠诚度成为健身俱乐部的重点课题。本次考试健身俱乐部会员管理系统需要包含4个功能页面:健身俱乐部会员查询列表页面、健身俱乐部会员添加页面、健身俱乐部会员修改页面健身俱乐部会员删除功能,考试结果需要提交设计报告可运行作品,设计报告包括,项目设计过程、项目测试过程项目总结,作品要有健身类主题的页面风格。2、考试要求本次考核的目的是检验Django这门课的基础知识实战掌握能力。考核内容涉及前端界面设计编写、后端功能逻辑编写、数据库设计,以及项目实现等多个环节。(1)需要根据系统要求,设计出合理的项目功能模块结构。在数据库设计方面,学生需要设计出适合项目需求的数据模型,确保数据库能够有效支撑项目功能的实现。(2)使用 Django 框架,编写出完整可运行的项目代码。这包括项目的创建、模型数据库的对接、URL 路由的配置,以及视图模板的开发。学生需确保项目功能实现完整、正确无误。前端设计1、页面设计,应包含:登录页、注册页、查询会员页、新增会员页、修改会员页(15)2、页面编写,需要使用Bootstrap HTML、CSS、JS等前端技术(15)30后端功能逻辑编写1、创建出Django项目,项目名示例: Supermarket(3)2、在项目下创建应用,应用名为:Member(2)3、根据业务逻辑分析创建出功能视图(5)4、利用模板渲染用户界面(10)5、使用ORM对数据库数据进行增删改查(10)30数据库设计1、创建Mysql数据库,定义名称为supermarket(5)2、创建会员表,表名为member(5)3、会员表包含字段(id,姓名,出生年月,积分余额,手机号,联系地址)(5)4、添加至少50条数据按照我上面所需的要求生成这个管理系统要求不要太难不需要过多安装别的依赖啥的,步骤要全完整
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值