ModelForm
为了简单我们今天不撩妹,专聊一个神奇的宝贝组件modelform,看到这个单词我们就明白这个组件就是把model和form组合起来,大家记住了!
就比如我们在使用的数据库中建立了一个客户表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册,老婆姓名(这是老王最爱的)等一大推消息,创建思路如下:
1.我们在html文件里使用form表单罗列这些字段,让用户自己填写,
2.只要使用了ModelForm就绕开了form的复杂性.直接来干就行,他早就在内部为我们生成好了
使用:
1.首先在py文件中导入ModelForm
from django.forms import ModelForm
在视图函数类定义一个类,记住一定要继承ModelForm,在这个类中在写另一个原类Meta(规定的 注意首字母大写)
class CustomerModelForm(forms.ModelForm):
class Meta:
model=models.Customer
fields='__all__'
exclude=['delete_status']
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name, field in self.fields.items():
if name=='course':
continue
field.widget.attrs.update({'class':'form-control'})
Model.py
class Customer(models.Model):
'''
客户表(最开始大家都是客户,销售就是不停的撩你,你还没有交钱上床就是客户)
'''
qq = models.CharField(verbose_name='QQ',max_length=64,unique=True,help_text='QQ号必须唯一')
qq_name=models.CharField('QQ昵称',max_length=64,blank=True,null=True)
name=models.CharField('姓名',max_length=32,help_text='学员报名后请改成真实姓名')# #可为空,有些人就不愿意给自己的真实姓名
sex_type=(('male','男'),('female','女'))
sex=models.CharField('性别',choices=sex_type,max_length=16,default='male',blank=True,null=True)#存的是male或者female,字符串
birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
phone = models.BigIntegerField('手机号', blank=True, null=True) # 手机号改成字符串的,不然不好搜索
source = models.CharField('客户来源', max_length=64, choices=source_type, default='qq')
introduce_from = models.ForeignKey('self', verbose_name="转介绍自学员", blank=True, null=True,
on_delete=models.CASCADE) # self指的就是自己这个表,和下面写法是一样的效果,自关联
course = MultiSelectField("咨询课程", choices=course_choices) # 多选,并且存成一个列表的格式,通过modelform来用的时候,会成为一个多选框
class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default='fulltime')
date = models.DateTimeField("咨询日期", auto_now_add=True) # 这个没啥用昂,我问销售,销售说是为了一周年的时候给客户发一个祝福信息啥的
last_consult_date = models.DateField("最后跟进日期", auto_now_add=True) # 考核销售的跟进情况,如果多天没有跟进,会影响销售的绩效等
next_date = models.DateField("预计再次跟进时间", blank=True, null=True) # 销售自己大概记录一下自己下一次会什么时候跟进,也没啥用
consultant = models.ForeignKey('Userinfo', verbose_name="销售", blank=True, null=True, on_delete=models.CASCADE)
ass_list = models.ManyToManyField('ClassList', verbose_name="已报班级", blank=True)
delete_status = models.BooleanField(default=False)
class Meta:
ordering = ['id', ]
verbose_name = '客户信息表'
verbose_name_plural = '客户信息表'
def __str__(self):
return self.name + ":" + self.qq
html
{% extends 'starter.html' %}
{% load mytags %}
{% block title %}
{% if tag == 1%}
公户信息展示
{% else %}
我的客户
{% endif %}
{% endblock %}
{% block content %}
<div class="row">
<div class="col-md-3">
<form action="">
<div class="input-group mb-3">
<div class="input-group-prepend">
<select name="action" id="">
<option value="">关键字</option>
<option value="qq__contains">qq</option>
<option value="name__contains">姓名</option>
</select>
</div>
<input type="text" class="form-control" aria-label="Text input with dropdown button" name="kw">
<button class="btn btn-primary">go</button>
</div>
</form>
</div>
</div>
<form action="" method="post">
{% csrf_token %}
<div class="input-group mb-3">
<div class="input-group-prepend">
<select name="bulk_action" id="">
{% if tag == 1 %}
<option value="reverse_gs">公户转私户</option>
{% else %}
<option value="reverse_sg">私户转公户</option>
{% endif %}
</select>
</div>
<button class="btn btn-primary">go</button>
</div>
{% if tag == 1 %}
<a href="{% url 'customer_add' %}" class="btn btn-primary">添加客户</a>
{% endif %}
<table style="margin-top: 10px;" class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>
{# <input type="checkbox">#}
#
</th>
<th>序号</th>
<th>QQ</th>
<th>姓名</th>
<th>性别</th>
<th>客户来源</th>
<th>咨询课程</th>
<th>状态</th>
<th>销售</th>
<th>跟进记录</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for customer in all_customers %}
<tr>
<td>
<input type="checkbox" name="cids" value="{{ customer.id }}">
</td>
<td>{{ request|list_number:forloop.counter }}</td>
<td>{{ customer.qq }}</td>
<td>{{ customer.name }}</td>
<td>{{ customer.get_sex_display }}</td>
<td>{{ customer.get_source_display }}</td>
<td>{{ customer.get_course_display }}</td>
<td>{{ customer.get_status_display }}</td>
<td>{{ customer.consultant.username|default:'暂无' }}</td>
<td>
<a href="{% url 'consult_record' %}?cid={{ customer.id }}">查看详情</a>
</td>
<td>
{# <a href="{% url 'customer_edit' customer.id %}?next={{ request.get_full_path }}" title="编辑"><i class="fa fa-pencil"></i> </a>| #}
<a href="{% resolve_url request 'customer_edit' customer.id %} " title="url编码编辑"><i class="fa fa-pencil"></i> </a>|
<a href="{% url 'customer_del' customer.id %}" title="删除"> <i class="fa fa-remove"></i></a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="9" style="text-align: center;">
sorry,没有查询相关用户信息,请核对后再查!!!!!
</td>
</tr>
{% endfor %}
</tbody>
</table>
</form>
{% endblock %}