ModelForm:

首先导入所需模块

from django.forms import ModelFormfrom django.forms import widgets as form_widgetsfrom django.forms import fields
 

save方法,可以有个返回对象,这个对象中有传回来的所有数据

如:

form = form.save()

form.__str__()     # 等同于str(form)

widgets可以手动为字段添加属性

  attr={"class","c1"}   定义属性

  choice={"value","text"}  定义字段

instance填充字段内容,一般用来编辑

扩展:

  modelform在生成页面字段的时候,普通字段,一般的为input框,如果,绑定外键字段,那么就会显示select框

示例:

views.py

from django.shortcuts import render, HttpResponse
from . import models
from django.forms import ModelForm
from django.forms import widgets as form_widgets

class Modelform_class(ModelForm):
    url = fields.CoiceField()   # 如果表中没有,就增加显示,如果有,就覆盖,可以用来重写字段类型,如,原来,的url是input框,你要变成select,就可以这样重写
    name = fields.CoiceField()  # 单选框
    hobby = fields.MultipleChoiceField()  # 复选框
    hobby2 = fields.CharField()  # 普通字段
    class Meta:
        model = models.Role
        fields = "__all__"  # 展示所有字段
        widgets = {
            # 为字段定制属性
            'name': form_widgets.TextInput(attrs={"class": "form-control", "id": "a1", })
        }
    def __init__(self,*args,**kwargs):
        """
        为父类的init方法添加扩展功能,因为,如果下拉框,在生成后,值就不变,当我们在更新数据后,这个下拉框中不会显示新增的值,只有在重启之后才能显示,而这样扩展后,添加完就会在下拉框中显示
        """
        super(Modelform_class,self).__init__(*args,**kwargs)
        self.fields['url'].choices = ("value","text")

def test(request):
    if request.method == "GET":

        form = Modelform_class()
        return render(request, 'test.html', {"form": form})
    elif request.method == "POST":

        form = Modelform_class(request.POST)
        if form.is_valid():
            form.save()
        return HttpResponse("数据添加成功")

def test2(request):
    obj = models.Role.objects.filter(pk=1).first()
    if request.method == "GET":

        form = Modelform_class(instance=obj)
        return render(request, 'test2.html', {"form": form})
    else:
        form = Modelform_class(request.POST)
        if form.is_valid():
            form.save()
        return HttpResponse("数据更新成功")

# -------------------------------

urls.py

from django.conf.urls import url
from django.contrib import admin
from app02.service import li
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test.html$', views.test),
    url(r'^test2.html$', views.test2),
]

# -------------------------------

models.py

class Role(models.Model):
    name= models.CharField(verbose_name='角色名称',max_length=32)
    def __str__(self):
        return self.name

# -------------------------------

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>

<form method="post" novalidate>
    {% csrf_token %}

    {{ form.as_p }}

    <input type="submit" value="提交  ">
</form>

</body>
</html>

# -------------------------------

test2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>

<form method="post" novalidate>
    {% csrf_token %}

    {{ form.as_p }}
{#   可以循环这个from对象,可以单独展示某个字段 #}
{#    {{ form.name }}#}
    <input type="submit" value="提交  ">
</form>

</body>
</html>

modelform简单示例                                

modelform示例


Form

首先也是导入模块

required=True # 字段不能为空
error_messages  # 自定义错误信息

  

问题:下拉框,新添加内容不展示,只有重启才能显示,解决办法如下

自动挡:

  自动刷新添加的数据,但是有个弊端,它自动将value=pk,内容显示为对象(queryset对象),它依赖类里面的__str__方法,不推荐自动挡

手动挡:

  我们开始只是定义这个字段,在__init__方法里,来手动刷新数据

from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.forms.models import ModelChoiceField

class UserInfoForm(Form):
   name = fields.CharField(required=True, error_messages={"required": "用户名不能为空!"})
    email = fields.EmailField(required=True, max_length=32)
    # part = fields.ChoiceField(choices=models.Department.objects.values_list("id","title"))
    part = fields.ChoiceField()  # 这里什么都不写,只是定义一个下拉框,下面重写,这里与下面重写,称呼为手动挡,因为需要们手动来实现这个功能

    # 再来个自动挡
    hobby = ModelChoiceField(queryset=models.Department.objects.all())

    def __init__(self, *args, **kwargs):
        """
        同样的,为了解决新添加的数据无法及时显示,我们在这里扩展__init__方法,来手动刷新数据
        :param args:
        :param kwargs:
        """
        super(UserInfoForm, self).__init__(*args, **kwargs)
        self.fields['part'] = models.Department.objects.values_list("id", "title")

参考博客

参考博客

Django Form&ModelForm的更多相关文章

  1. Django Form ModelForm modelfromset

    forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...

  2. Django Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  3. Django之路12——form modelform formset modelformset的各种用法

      首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的 ...

  4. Django - Form和ModelForm

    [TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...

  5. Django Form and ModelForm

    Form介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...

  6. 6月28日 Django form组件 和 modelform组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  7. Django中ModelForm应用

    Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...

  8. Django form模块使用心得

    最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建一个Form表单有两种方式: 第一种方式是继承于forms.Form,的一个子类,通过在f ...

  9. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

随机推荐

  1. Centos 中 vi 和vim 的区别

    它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面. vim的这些优势主要体现在以下几个方面:1.多级撤消我们知道在vi里,按 u只能撤消上次 ...

  2. 如何学Python

    如何学习Python? Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.它们包括:1.常用内置类型(int, float, bool, bytes, st ...

  3. iOS UI基础-9.2 UITableView 简单微博列表

    概述 我们要实现的效果: 这个界面布局也是UITableView实现的,其中的内容就是UITableViewCell,只是这个UITableViewCell是用户自定义实现的.虽然系统自带的UITab ...

  4. Semaphore wait has lasted > 600 seconds

    解决方案:set global innodb_adaptive_hash_index=0;

  5. python ip代理

    import random import urllib.request from bs4 import BeautifulSoup import time url ='http://www.whati ...

  6. META标签之关键词、网页描述设置帮助SEO网站优化(转)

      ASP.NET 4.0 Web Forms针对SEO改进措施中有一个是在Page类中加了2个新属性:MetaKeywords 和MetaDescription,它们使得在后台代码类中用编程的手法设 ...

  7. Maven的作用、用途、内涵、愿景

    maven被许多人认为是一个构建工具.许多人最初是从熟悉ant而转到maven的,因此很自然地这样认为maven是一个构建工具.但是maven并不仅仅是一个构建工具,也不是ant的一个替代工具.mav ...

  8. uva 10600 ACM Contest And Blackout

    题意: 求最小生成树和次小生成树的总权值. 思路: 第一种做法,适用于规模较小的时候,prim算法进行的时候维护在树中两点之间路径中边的最大值,复杂度O(n^2),枚举边O(m),总复杂度O(n^2) ...

  9. 前端和后台BUG区分方法

    测试工程师不只是负责发现问题,除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产品的流程.开发方案.开发人员 ...

  10. mitmproxy 中间人攻击的小玩笑

    import mitmproxy.http from mitmproxy import ctx, http class Joker: def request(self, flow: mitmproxy ...