?笔记:由于成本项的数据并不是特定的,如果写死了,前段人员不能修改。如何实现前端人员具有一定的编辑成本项功能。
思路:
第一步:数据库字段命名为d1,d2,d3.......?
第二步:后台按照html模版,给定的位置,由用户按照顺序,分别自定义费用项名称
第三步:将第二步录入的数据与数据库字段d1,d2,d3绑定。数据数据输出时,以自定义的名称按按顺序依次显示数据库中的数据。
测试代码:?接收前端的字段,按{'d1':'参数1','d2':'参数2','d3':'参数3'}?样式写成字典后,存入数据表(要先转成json)
#models.py
class Bind_Keyword(db.Model):
__tablename__ = 'bind_keyword'
id = db.Column(db.Integer, primary_key=True)
proj_id = db.Column(db.Integer)
bind_data = db.Column(db.String(128))
def check_bind_id(bind_keyword):
return {
'porj_id': bind_keyword.proj_id,
}
'''-----------------------------------------'''
blueprint.py
from models import key_to_dict,Bind_Keyword,check_bind_id
@bp.route('/bind',methods=["GET", "POST"])
def bind_keywords():
#从前端接收数据,CS1,CS2,CS3
if request.method=='POST':
data_cs1=request.values.get('cs1')
data_cs2 = request.values.get('cs2')
data_cs3 = request.values.get('cs3')
print(data_cs1)
dict={}
#写入字典,格式为{'d1':'参数1','d2':'参数2','d3':'参数3'}
dict.update({'d1':data_cs1,'d2':data_cs2,'d3':data_cs3})
print(dict) #{'d1': '人工', 'd2': '22', 'd3': 'Q'}
dict =json.dumps(dict) #转成json格式,否则不能写入到字典中 {"d1": "\u4eba\u5de5", "d2": "22", "d3": "Q"}
#将字典写入到数据库中---新建Bind_Keyword数据库
if dict:
pid=2 #暂定项目编号是2
'''先判断数据库中是否有这个proj_id的数据,如果没有则新插入,如有有,则更新'''
#先找到数据库中projcet_id
p_id = Bind_Keyword.query.all()
projcet_id = (list(map(check_bind_id, p_id)))
list_v = []
for i in projcet_id:
for k,v in i.items():
list_v.append(v)
#projcet_id写入到字典
print(list_v) #[1, 3]
#判断
if pid in list_v:
print('在列表中,下面开始按更新修改数据')
Bind_Keyword.query.filter_by(proj_id=pid).update({'bind_data': dict})
db.session.commit()
else:
print('不在列表中,下面开始按照新增写入')
data = Bind_Keyword(proj_id=pid, bind_data=dict)
db.session.add(data)
db.session.commit()
return render_template('bind_keyword.html')
注意: 前端录入的参数字段不能重复,需要采用js进行判断
将dict从字典中取出,并与数据库中的数据进行匹配,绑定成新的数据
@bp.route('/bind_data',methods=["GET", "POST"])
def bind_data():
pid = 2 # 暂定项目编号是2
#测试将dict取出
d = session.query(Bind_Keyword).filter_by(proj_id=pid).first()
dict = json.loads(d.bind_data)
print(type(dict))
#匹配结果
# dict={'A':'人工费','B':'材料费','C':'机械费'}
#从数据中拿到数据,并写成列表格式
data1 = Cost_Target.query.all()
data1_map = list(map(key_to_dict, data1))
print(data1_map)
#[{'id': 1, 'd1': 1, 'd2': '', 'd3': '1'}, {'id': 3, 'd1': 3, 'd2': '222', 'd3': ''}]
#将上面列表中的d1,d2,d3替换成dict字典中,对应的 值,即d1→参数1,d2→参数2
for i in data1_map:
print(type(i)) #{'id': 1, 'A': 1, 'B': '', 'C': '1'}
for m, n in dict.items():
# print('**', m, n)
for k in i:
# print('++',k,v)
if k ==m:
i[n] = i.pop(k)
break
print(data1_map)
#[{'id': 1, '人工费': 1, '材料费': '', '机械费': '1'}, {'id': 3, '人工费': 3, '材料费': '222', '机械费': ''}]
return render_template('bind_data.html',data=data1_map)
|