modelForm的使用及参数设置

  从modelForm这个名字就能看出来,这个form是和模型类model有知己诶关联的,还是以数和出版社的模型来说明:

models.py(模型)

from django.db import models

# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
pub_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
state=models.IntegerField(choices=((1,'已出版'),(2,'未出版')),default=1) #在数据库存储是以数字存储的,怎么取值?book是类的对象--book.get_state_display
publish = models.ForeignKey(to="Publish", to_field="id", on_delete=models.CASCADE, null=True)
authors = models.ManyToManyField("Author", db_table="book2authors") # 创建关系表 def __str__(self):
return self.title class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.CharField(max_length=32) def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
gender=models.IntegerField(choices=((1,'男'),(2,'女'),),default=1)#在数据库存储是以数字存储的,怎么取值?book是类的对象--book.get_gender_display

 urls.py(路径分发)

urlpatterns = [
path('admin/', admin.site.urls),
path('books/', views.books, name='books'),
path('addbooks/', views.addbooks, name='addbooks'),
re_path('delbooks/(\d+)', views.delbooks),
re_path('editbooks/(\d+)', views.editbooks)
]

  view.py(视图函数)

#创建Modelforms类并指向模型Book,为了渲染数据和校验使用
class BookModelForm(forms.ModelForm):    #看清楚继承的类不再是forms.Form而是forms.Modelform
class Meta:
model = models.Book #指定为哪个模型创建的
# fields=['title','price'] #指定模型的字段
# exclude=['title'] #排除互某个字段
fields = '__all__' #指定所有的字段

      widgets={                                           #参数设置,指定字段设置
            "title":wid.TextInput(attrs={"class":"form-control"}),
            "price":wid.TextInput(attrs={"class":"form-control"})
            }
      error_messages={                                   #错误信息设置,要看清楚对齐的方式
            "title":{"required":"该字段不能为空"}  
            }
      labels={                                          #对field的label进行设置
        "title":"书籍名称"
          }

#查看书籍
def books(request):
booklist = models.Book.objects.all()
return render(request, 'books.html', {'booklist': booklist}) #添加书籍
def addbooks(request):
# 通过form/ModelForm以及校验标签渲染字段以及输入框
if request.method == 'POST':
form = BookModelForm(request.POST)
if form.is_valid():
form.save()
return redirect('/books/')
else:
return render(request, 'addbooks.html', {'form': form})
else:
# form=BookForm() #form组件形式,根据字段选择不同的字段类型
form = BookModelForm()
return render(request, 'addbooks.html', {'form': form})

#编辑书籍
def editbooks(request, editbook_id):
editbook=models.Book.objects.filter(pk=editbook_id).first()
if request.method == 'POST':
form=BookModelForm(request.POST,instance=editbook) #对象要带,要不然直接保存,就跟添加是一模一样的,不变成了添加,而不是是修改修改源对象
if form.is_valid():
form.save()
return redirect('/books/')
else:
return render(request,'editbooks.html',{'form':form})
else:
form=BookModelForm(instance=editbook)
return render(request,'editbooks.html',{'form':form})

  关于html:

#form.html  添加和编辑共用功能区共用这一部分,所以提取出来

<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }} <span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" value="提交" class="btn btn-default pull-right">
</form>
</div>
</div>
</div> #add_books.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body> <h3>添加书籍</h3>
{% include 'form.html' %} </body>
</html>
#edit_book
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑书籍</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body> <h3>编辑书籍</h3> {% include 'form.html' %} </body>
</html>

form组件之modelForm的更多相关文章

  1. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  2. python 终极篇 --- form组件 与 modelForm

                                                           form组件                                       ...

  3. Django——form组件和ModelForm

    一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...

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

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

  5. 原生Form 和 Form组件 Modelform

    主要的文件:manage.py,url.py,views.py,settings.py,models.py manage.py:项目管理文件,一般不做修改. url.py:路由系统,配置views.p ...

  6. 基于Form组件实现的增删改和基于ModelForm实现的增删改

    一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...

  7. django----基于Form组件实现的增删改和基于ModelForm实现的增删改

    一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...

  8. python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类

    自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...

  9. Web框架django[Form]组件

    新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...

随机推荐

  1. windows下启动命令行

    1.当前目录打开命令窗口:shift+鼠标右键,然后打开命令窗口 2.查看监听的端口:netstat – ano

  2. ViewPager的使用方法

    首先是 导入jar包   下载地址:android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopy <android.suppor ...

  3. css知多少(3)——样式来源与层叠规则(转)

    css知多少(3)——样式来源与层叠规则   上一节<css知多少(2)——学习css的思路>有几个人留言表示思路很好.继续期待,而且收到了9个赞,我还是比较欣慰的.没看过的朋友建议先去看 ...

  4. Node.js的__dirname,__filename,process.cwd(),./的含义

    简单说一下这几个路径的意思,: __dirname: 获得当前执行文件所在目录的完整目录名 __filename: 获得当前执行文件的带有完整绝对路径的文件名 process.cwd():获得当前执行 ...

  5. ZROI2018提高day3t2

    传送门 分析 我们设A[i]表示点i有几个矿,B[i]表示这之中有几个矿是第一次出现,所以点i的贡献即为 (2^B[i]-1)*(2^(A[i]-B[i])) 注意减一的原因是第一次出现的矿应至少有一 ...

  6. vue 之 模板字符串

    传统的JavaScript语言,输出模板通常是这样的写的. $('#result').append( 'There are <b>' + basket.count + '</b> ...

  7. String、StringBuffer与StringBuilder之间区别 .RP

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...

  8. Spark的广播变量模块

    有人问我,如果让我设计广播变量该怎么设计,我想了想说,为啥不用zookeeper呢? 对啊,为啥不用zookeeper,也许spark的最初设计哲学就是尽量不使用别的组件,他有自己分布式内存文件系统, ...

  9. clions的使用

    最近无聊玩了下CLion这个IDE,顺便学习了下CMAKE怎么使用.话说CLion的CMAKE的支持还不是特别的完好,和命令行模式还有有区别,有如下几个问题: 1:CMAKE的编译目录不能指定,而是I ...

  10. 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)

    一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...