利用ModelForm在页面实现数据的增删改查
作者:互联网
1、初始数据(model)
1.1、创建数据
from django.db import models
from multiselectfield import MultiSelectField #需要pip install django-multiselectfield
# 这里是对后续再model中使用choices是设置的元组。
products_choices = (('phone', '手机'),
('PC', '个人电脑'),)
class Clients(models.Model):
"""
创建一个客户信息的表
"""
qq = models.CharField(verbose_name='QQ', max_length=64, unique=True, help_text='QQ号必须唯一') # verbose_name 是在django admin或表单的认证时中显示的名字
# unique是唯一
# help_text也是在django admin或表单的认证时显示的提示信息。
name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='与客户交流后,请改为真实姓名')
sex_type = (('male', '男性'), ('female', '女性'))
# 做一个元组,用于存放对应信息,在数据库中存放male,显示时,可以显示男性。
sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True)
# 从形参角度看,第一个参数就是verbose_name,这里等价于verbose_name="性别"
# choices 指向了对应的元组,存的是male或者female。
# default 默认值
birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
# DateField ,记录日期类的比较合适。
phone = models.BigIntegerField('手机号', blank=True, null=True)
# 这里只是为了展示BigIntegerField这个类型,真实使用时,最好用CharField
products = MultiSelectField("咨询课程", choices=products_choices)
# MultiSelectField 在admin里可以显示多选框。
last_consult_date = models.DateField("最后跟进日期", auto_now_add=True)
# auto_now_add ,自动增加日期。这是DateField才有
next_date = models.DateField("预计再次跟进时间", blank=True, null=True)
# null 表示数据库里可以是空
# blank 用于表单的认证时可以为空。
# 为什么有两种空,这是为了实现四种组合,有些数据,我们可以由系统记录,但是不希望是用户在表单中填写,这时,系统中 null = True , blank = False
introduce_from = models.ForeignKey('self', verbose_name="转介绍于其他客户", blank=True, null=True,on_delete=models.CASCADE)
# self指的就是自己这个表,和下面写法是一样的效果,Foreignkey的自自引用写法。
# on_delete=models.CASCADE,表示是否删除联动,这里表示的是不联动,主的删掉了,关联的不删。
class Meta:
# 这个是表单和人交互时的元类,下面的内容,便于表单展示。
unique_together = ('name','phone') # 联合唯一。这个组合仅用于演示
ordering = ['id',] # 按照id排序
verbose_name='客户信息表' # 表名
verbose_name_plural = '客户信息表' # 在表单里可以显示的名字
def __str__(self):
return self.name+":"+self.qq # 在django admin的表单中,显示一行数据的时候,会显示这个名称,便于识别是哪一行数据。
1.2、执行model中的操作
python manage.py makemigrations
python manage.py migrate
2、创建ModelForm表单
在app下创建myforms.py,创建对应的表单类,表单最大价值是可以制定多种合规性检查。
# myforms.py
from sales import models
from django import forms
class CustomerModelForm(forms.ModelForm):
class Meta:
model = models.Clients # Clients就是model中的类。
fields = '__all__' # 可以在这里过滤字段fields =('qq','name'),也可以在页面显示的时候再过滤
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field_name, field in self.fields.items(): # 按照字典的方式打开。
from multiselectfield.forms.fields import MultiSelectFormField
if not isinstance(field,MultiSelectFormField): #这里是为了给使用了MultiSelectFormField的进行过滤,否则页面会乱码
field.widget.attrs.update({'class': 'form-control'}) #给field增加页面显示的属性。
3、创建URL
创建路径
# urls.py
from django.conf.urls import url
from django.contrib import admin
from sales import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^clients/', views.clients,name='clients'),
url(r'^addclients/', views.editClients,name='addclients'),
url(r'^editclients/(\d+)', views.editClients,name='editclients'),
]
4、创建views
# views.py
from django.shortcuts import render,HttpResponse,redirect
from django.http import JsonResponse
from django import forms
from . import models
from crm import myforms
# 创建查询
def clients(request):
all_clients=models.Clients.objects.all()
return render(request,'Customer.html', {'all_clients':all_clients},)
# 增加和修改
def addEditClients(request,n=None):
old_obj = models.Clients.objects.filter(pk=n).first()
label = '编辑客户信息' if n else '添加客户'
if request.method == 'GET':
client_form_obj = myforms.ClientsModelForm(instance=old_obj)
return render(request,'edit_Clients.html',{'client_form_obj':client_form_obj,'label':label})
elif request.method == 'POST':
book_form_obj = myforms.ClientModelForm(request.POST,instance=old_obj)
if client_form_obj.is_valid(): # 表单校验
client_form_obj.save() # 通过了保持
return redirect('clients')
else:
return render(request, 'edit_Client.html', {'client_form_obj': client_form_obj,'label':label})
5、配置静态文件
5.1、settings中
# settings.py中配置
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
INSTALLED_APPS = [
'clients.apps.ClientsConfig',
# 'clients' app的名字
]
# 配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'crm',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123456',
}
}
STATIC_URL = '/static/' #在url中传输用这个字段
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static'), #这里是本地的static文件夹名称,可以自行配置
]
5.2、使用bootstrap
1、本地配置,使用静态文件
2、还可以使用CDN配置。
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
6、创建页面template
6.1、创建模板-load-block
{#base.html#}
{% load static %} //加载static静态文件夹
<!DOCTYPE html>
<html lang="en">
<head>
{% block title %}
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
6.2、创建展示页-for-forloop
{% extends 'starter.html' %}
{% block title %}
<h1 class="m-0">所有客户列表</h1>
{% endblock %}
{% block content %}
<div class="card">
<!-- /.card-header -->
<div class="card-body">
<a href="{% url 'addclients' %}" class="btn btn-primary">添加用户</a>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>序号</th>
<th>QQ</th>
<th>姓名</th>
<th>性别</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for client in all_clients %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ customer.qq }}</td>
<td>{{ customer.name }}</td>
<td>{{ customer.sex }}</td>
<td>
<a href="{% url 'editclients' client.pk %}"><i class="fa fa-edit"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
{% endblock %}
6.3、创建和修改base页
这个页面是用于被修改和增加时引用的页面。
//add_edit_clients.html.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Title</title>
</head>
<body>
<form class="form-horizontal" action="" method="post" novalidate>
{% csrf_token %}
{% for field in cliets_form_obj %}
<div class="form-group">
<label for="{{ field.id_for_label }}" class="col-sm-2 control-label ">{{ field.label }}</label>
<div class="col-sm-8">{{ field }}</div>
<span class="text-danger">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-primary">提交</button>
</div>
</div>
</form>
</body>
</html>
6.4、创建修改和添加页面使用include
{% extends 'starter.html' %}
{% block header_info %}
<h1>{{ label }}</h1>
{% endblock %}
{% block content %}
{% include 'add_edit_clients.html' %}
{% endblock %}
标签:name,models,True,clients,改查,django,增删,import,ModelForm 来源: https://www.cnblogs.com/lvjinfeng/p/16244110.html