django form 和modelform样式设置
目录
1.form通过attr设置属性
2.输入框设置表单状态
3.modelform的使用
4.结合modelform 使用for循环生成输入框
5.基于init构造方法设置样式
6.基本增删改查案例
7.基于ajax和sweetalert实现删除操作
以text input框为例
模板文件需要有bootstrape from django import forms class DepForm(forms.Form):
name = forms.CharField(label="部门名称",widget=forms.TextInput(attrs={'class':'form-control'})) #可以添加多个
count = forms.IntegerField(label="部门人数") #IntegerField没有这个属性 def department_add(request):
form_obj = DepForm()
return render(request,'department_add.html',{'form_obj':form_obj}) 模板文件如下:
{% extends 'layout.html' %}
{% block content %} <div class="container">
<div style="margin-top: 20px">
<form class="form-horizontal">
<div class="form-group">
<label for="{{ form_obj.name.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.name.label }}</label>
<div class="col-sm-8">
{# <input type="email" class="form-control" id="inputEmail3" placeholder="Email">#}
{{ form_obj.name }}
{{ form_obj.name.errors }}
</div>
</div> <div class="form-group">
<label for="{{ form_obj.count.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.count.label }}</label>
<div class="col-sm-8">
{{ form_obj.count }}
{{ form_obj.count.errors }}
</div>
</div> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form> </div>
</div>
{% endblock %}
输入框设置表单状态,错误时显示红色错误提示 #通过if 判断和bootstrape实现
{% extends 'layout.html' %}
{% block content %} <div class="container">
<div style="margin-top: 20px">
<form class="form-horizontal" method="post" action="" novalidate>
{% csrf_token %}
<div class="form-group {% if form_obj.name.errors %}has-error{% endif %}"> <label for="{{ form_obj.name.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.name.label }}</label>
<div class="col-sm-8"> {{ form_obj.name }}
<span class="help-block">{{ form_obj.name.errors.0 }}</span> </div>
</div> <div class="form-group">
<label for="{{ form_obj.count.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.count.label }}</label>
<div class="col-sm-8">
{# <input type="email" class="form-control" id="inputEmail3" placeholder="Email">#}
{{ form_obj.count }}
{{ form_obj.count.errors.0 }}
</div>
</div> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form> </div>
</div>
{% endblock %} 设置modelform class DepForm(forms.ModelForm):
class Meta:
#models 根据某一个模型生成对应的字段
model = models.Department #model命令否则会报错
fields = '__all__' #拿所有的字段 fields = ['name'] 拿想拿的字段
#exclude = ['count'] 排除不想要的字段
# labels = {
# 'name':'名称' #设置提示
# }
widgets = {
'name':forms.TextInput(attrs={'class':'form-control'}) #设置样式
} error_messages = {
'name':{'required':'此项是必填的'} #设置错误提示信息
}
通过for循环生成多个输入框
{% extends 'layout.html' %}
{% block content %} <div class="container">
<div style="margin-top: 20px">
<form class="form-horizontal" method="post" action="" novalidate>
{% csrf_token %}
{% for field in form_obj %}
<div class="form-group {% if form_obj.name.errors %}has-error{% endif %}"> <label for="{{ field.id_for_label }}"
class="col-sm-2 control-label">{{ field.label }}</label>
<div class="col-sm-8">
{{ field }}
<span class="help-block">{{ field.errors.0 }}</span> </div>
</div> {% endfor %} <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form> </div>
</div>
{% endblock %}
通过init方法统一设置样式
class DepForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs) #初始化父类方法
print(self.fields)
for field in self.fields.values():
field.widget.attrs = {'class':'form-control'} class Meta:
#models 根据某一个模型生成对应的字段
model = models.Department #model命令否则会报错
fields = '__all__' #拿所有的字段 fields = ['name'] 拿想拿的字段 def department_add(request):
form_obj = DepForm()
if request.method == 'POST':
form_obj = DepForm(request.POST)
if form_obj.is_valid():
"""
数据校验成功
"""
print(form_obj.cleaned_data)
# models.Department.objects.create(name=form_obj.cleaned_data.get('name'),count=form_obj.cleaned_data['count'])
#models.Department.objects.create(**form_obj.cleaned_data)
form_obj.save() #直接把数据插入数据库里面
return redirect("/department_list/")
return render(request,'department_add.html',{'form_obj':form_obj})
查询案例
后台代码
def department_list(request):
all_depart = models.Department.objects.all()
return render(request,'department_list.html',{'all_depart':all_depart}) 模板代码
{% extends 'layout.html' %}
{% block content %}
<div class="container" style="margin-top: 10px">
<table class="table table-bordered">
<thead>
<tr>
<th>序号</th>
<th>名称</th>
<th>人数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for depart in all_depart %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ depart.name }}</td>
<td>{{ depart.count }}</td>
<td>
<a href="{% url 'department_edit' depart.pk %}"><i class="fa fa-edit"></i>
</a>
<a href="{% url 'department_del' depart.pk %}"><i class="fa fa-trash-o"></i></a>
</td>
</tr>
{% endfor %} </tbody>
</table>
</div> {% endblock %}
添加案例
后端代码
def department_add(request):
form_obj = DepForm()
if request.method == 'POST':
form_obj = DepForm(request.POST)
if form_obj.is_valid():
"""
数据校验成功
"""
print(form_obj.cleaned_data)
# models.Department.objects.create(name=form_obj.cleaned_data.get('name'),count=form_obj.cleaned_data['count'])
models.Department.objects.create(**form_obj.cleaned_data)
return redirect("/department_list/")
return render(request,'department_add.html',{'form_obj':form_obj}) 模板代码
{% extends 'layout.html' %}
{% block content %} <div class="container">
<div style="margin-top: 20px">
<form class="form-horizontal" method="post" action="" novalidate>
{% csrf_token %}
{% for field in form_obj %}
<div class="form-group {% if form_obj.name.errors %}has-error{% endif %}"> <label for="{{ field.id_for_label }}"
class="col-sm-2 control-label">{{ field.label }}</label>
<div class="col-sm-8">
{{ field }}
<span class="help-block">{{ field.errors.0 }}</span> </div>
</div> {% endfor %} <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form> </div>
</div>
{% endblock %}
编辑案例
后端代码
def department_edit(request,pk):
obj = models.Department.objects.filter(pk=pk).first()
form_obj = DepForm(instance=obj)
if request.method == 'POST':
form_obj = DepForm(request.POST,instance=obj) #包含原始数据和新数据
if form_obj.is_valid():
form_obj.save()
return redirect('/department_list/') return render(request, 'department_edit.html', {'form_obj': form_obj}) 模板代码
{% extends 'layout.html' %}
{% block content %} <div class="container">
<div style="margin-top: 20px">
<form class="form-horizontal" method="post" action="" novalidate>
{% csrf_token %}
{% for field in form_obj %}
<div class="form-group {% if form_obj.name.errors %}has-error{% endif %}"> <label for="{{ field.id_for_label }}"
class="col-sm-2 control-label">{{ field.label }}</label>
<div class="col-sm-8">
{{ field }}
<span class="help-block">{{ field.errors.0 }}</span> </div>
</div> {% endfor %} <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form> </div>
</div>
{% endblock %}
简单删除案例
def department_del(request,pk):
obj = models.Department.objects.filter(pk=pk).first().delete() #根据pk找到对象
return redirect('department_list')
通过ajax和sweetalert删除数据案例
https://sweetalert.js.org/guides/
后端代码
from django.http.response import JsonResponse
def department_del(request,pk):
ret = {'status':0,'msg':'删除成功'}
obj = models.Department.objects.filter(pk=pk).first().delete() #根据pk找到对象
# return redirect('department_list')
print(pk)
return JsonResponse(ret) 模板文件代码
{% extends 'layout.html' %}
{% load static %}
{% block content %} <div class="container" style="margin-top: 10px">
{% csrf_token %}
<table class="table table-bordered">
<thead>
<tr>
<th>序号</th>
<th>名称</th>
<th>人数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for depart in all_depart %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ depart.name }}</td>
<td>{{ depart.count }}</td>
<td>
<a href="{% url 'department_edit' depart.pk %}"><i class="fa fa-edit"></i>
</a>
<a href=""><i url="{% url 'department_del' depart.pk %}" class="fa fa-trash-o"></i></a>
</td>
</tr>
{% endfor %} </tbody>
</table>
</div> {% endblock %} {% block js %} <script> $('.fa-trash-o').click(function () {
swal({
title: "Are you sure?",
text: "Once deleted, you will not be able to recover this imaginary file!",
icon: "warning",
buttons: true,
dangerMode: true,
})
.then((willDelete) => {
if (willDelete) {
$.ajax({
url: $(this).attr('url'),
type: 'post',
headers: {
'x-csrftoken': $('input[name="csrfmiddlewaretoken"]').val(),
},
success: (ret) => {
if (!ret.status) {
$(this).parent().parent().parent().remove();
swal("Poof! Your imaginary file has been deleted!", {
icon: "success",
});
}
} }); } else {
swal("Your imaginary file is safe!");
}
}); })
</script>
{% endblock %} ps:测试的过程中有点小瑕疵,但是功能基本上都能实现.
django form 和modelform样式设置的更多相关文章
- Django Form和ModelForm组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django Form and ModelForm
Form介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...
- Django Form and Modelform Admin定义 高级查询)
Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...
- Django - Form和ModelForm
[TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...
- Django—Form、ModelForm
一.Form form.py from django import forms from django.core.exceptions import ValidationError from djan ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- 12.Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
随机推荐
- python笔记6 模块与包 程序开发规范 包 re sys time os模块
模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他 ...
- 《maven实战》笔记(5)----maven的版本
maven中构件和项目都有自己的版本,其中分为稳定的发布版本和不稳定的快照版本. 1.0.0.1.3-alpha-4和2.0就是稳定版本,而2.1-SNAPSHOT和2.1-20091214.2214 ...
- CSS3常用属性及效果汇总
本文转载于<https://blog.csdn.net/lyznice/article/details/54575905> 一.2D效果属性 要使用这些属性,我们需要通过 transfor ...
- jemter 90%line的解释
假如: 有10个数: 1.2.3.4.5.6.7.8.9.10 按由大到小将其排列. 求它的第90%百分位,也就是第9个数刚好是9 ,那么他的90%Line 就是9 . 另一组数: 2.2.1. ...
- javaweb大文件上传
本文主要关于利用html表单上传文件的后台代码实现. 需要用到两个工具类Apache commons-fileupload和commons-io. 注意要校验是否选择文件上传,最开始写的时候没有加上校 ...
- 反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段
反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段
- Instant Messaging for Business: Your 10 Best Options
Instant Messaging for Business: Your 10 Best Options By Iaroslav Kudritskiy It's probably not a surp ...
- 开始学习Yii
YII是我一直想学的一个框架,之前看过TP3.2和5.0.Yii是Yes it is 的缩写. 我采用下载源码的方式安装,解压到web目录.以前用过Composer,Yii官网也推荐用Composer ...
- C++之cmath常用库函数一览
cmath是c++语言中的库函数,其中的c表示函数是来自c标准库的函数,math为数学常用库函数. cmath中常用库函数: 函数 作用 int abs(int i); 返回整型参数i的绝对值 dou ...
- 删除Vue中无权限的【node_modules】文件
npm install rimraf -g rimraf node_modules