1.crm

  客户关系管理系统 :1.业务逻辑部分  2.权限插件

2.forms组件之modelform

  modelform就是model+form ,form根据model的字段生成标签 ,校验信息以及记录的功能 ,一步提交所有数据功能

  使用方法:

    1)定义个类继承forms.modelform

    2)定义哪些字段生成标签fields = '__all__'所有标签

    3)定义错误信息以字典的格式

    4)重写init方法使用插件给标签更新属性

    5)实例化modelform时候 ,如果是对已有对象进行修改需要添加 instance = 已有对象这个参数 ,指定修改对象生成前段标签

    6)is_valid()通过后可以直接使用 obj.save()提交数据

####model
class Dep(models.Model):
name = models.CharField(max_length=32, verbose_name='部门') #前端的显示label等于verbose_name
desc = models.CharField(max_length=128, verbose_name='描述') ####view
from django import forms # Create your views here.
class DepForm(forms.ModelForm):
# 也可以重写modle中已有的字段!
# name = forms.CharField()
class Meta:
model = models.Dep
fields = '__all__'
     #exclude = []      #排除字段
        error_messages = {            #给每个字段定义错误提示
'name':{
'required': '必填项'
},
'desc':{
'required': '必填项'
}
} def __init__(self, *args, **kwargs): #定义字段生成标签的属性!
super(DepForm, self).__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'}) def depadd(request):
form_obj = DepForm()
if request.method == 'POST':
form_obj = DepForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect(reverse('crm:deplist'))
print()
return render(request, 'depadd-edit.html', {'form_obj': form_obj})
def depedit(request, edit_id):
obj = models.Dep.objects.filter(pk=edit_id).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(reverse('crm:deplist'))
return render(request, 'depadd-edit.html', {'form_obj': form_obj})

3.优化删除功能使用alter弹窗提示

  异步思想: 删除点击后弹出框提示是否删除 ,如果删除前端移除该行记录 ,数据库中删除该条记录 (sweetalter + ajax + 前端js删除父级标签)

4.密码加密处理

  用户输入两次密码 ,如果成功 ,直接使用md5加密存放在数据库中 。所以用户输入的密码永远先做md5的处理   

  url部分

###url
from django.conf.urls import url, include
from django.contrib import admin
from crm.view import user, dep urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^user/list/', user.userlist, name='userlist'),
url(r'^user/add/', user.useradd, name='useradd'),
url(r'^user/edit/(\d+)/', user.useredit, name='useredit'),
url(r'^user/del/(\d+)/', user.userdel, name='userdel'), url(r'^dep/list/', dep.deplist, name='deplist'),
url(r'^dep/add/', dep.depadd, name='depadd'),
url(r'^dep/edit/(\d+)/', dep.depedit, name='depedit'),
url(r'^dep/del/(\d+)/', dep.depdel, name='depdel'), ]

  view部分

###dep-view
from django.shortcuts import render, reverse, redirect, HttpResponse
from crm import models
from django import forms # Create your views here.
class DepForm(forms.ModelForm):
# 也可以重写modle中已有的字段!
# name = forms.CharField()
class Meta:
model = models.Dep
fields = '__all__'
error_messages = {
'name': {
'required': '必填项'
},
'desc': {
'required': '必填项'
}
} def __init__(self, *args, **kwargs):
super(DepForm, self).__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'}) def deplist(request):
all_obj = models.Dep.objects.all()
return render(request, 'deplist.html', {'msg': all_obj}) def depedit(request, edit_id):
obj = models.Dep.objects.filter(pk=edit_id).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(reverse('crm:deplist'))
return render(request, 'depadd-edit.html', {'form_obj': form_obj}) def depadd(request):
form_obj = DepForm()
if request.method == 'POST':
form_obj = DepForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect(reverse('crm:deplist'))
return render(request, 'depadd-edit.html', {'form_obj': form_obj}) def depdel(request, del_id):
obj = models.Dep.objects.filter(pk=del_id).delete()
return redirect(reverse('crm:deplist')) ###user-view from django.shortcuts import render, reverse, redirect, HttpResponse
from crm import models
from django import forms
from django.forms import ValidationError
import hashlib class UserFrom(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserFrom, self).__init__(*args, **kwargs) for field in iter(self.fields):
self.fields[field].widget.attrs.update({'class': 'form-control'}) re_password = forms.CharField(
label='确认密码',
widget=forms.PasswordInput()
) class Meta:
model = models.User
fields = ['name', 'age', 'sex', 'password', 're_password', 'dep', 'desc']
widgets = {
'password': forms.PasswordInput
} sex = forms.ChoiceField(
label='性别',
choices=((0, '男'), (1, '女')),
widget=forms.widgets.Select() ) def clean(self):
password = self.cleaned_data.get('password')
re_password = self.cleaned_data.get('re_password')
if password == re_password:
md5 = hashlib.md5()
md5.update(password.encode('utf-8'))
self.cleaned_data['password'] = md5.hexdigest()
return self.cleaned_data
self.add_error('re_password', '两次密码不同!')
raise ValidationError('两次密码不同!') def userlist(request):
all_obj = models.User.objects.all()
return render(request, 'userlist.html', {'msg': all_obj}) def useredit(request, edit_id):
obj = models.User.objects.filter(pk=edit_id).first()
form_obj = UserFrom(instance=obj)
if request.method == 'POST':
form_obj = UserFrom(request.POST, instance=obj)
if form_obj.is_valid():
form_obj.save()
return redirect(reverse('crm:userlist'))
return render(request, 'depadd-edit.html', {'form_obj': form_obj}) def useradd(request):
form_obj = UserFrom()
if request.method == 'POST':
form_obj = UserFrom(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect(reverse('crm:userlist'))
return render(request, 'depadd-edit.html', {'form_obj': form_obj}) def userdel(request, del_id):
models.User.objects.filter(pk=del_id).delete()
return redirect(reverse('crm:userlist'))

  html部分

###deplist.html

{% extends 'layout.html' %}
{% load static %}
{% block js %}
<script src="{% static '/js/sweetalter.js' %}"></script>
<script> $('.b1').click(function () { swal({
title: "提示",
text: "删除后无法恢复",
icon: "warning",
buttons: true,
dangerMode: true,
})
.then((willDelete) => {
let del_id = $(this).attr('del_id');
if (willDelete) {
$.ajax({
url: '/crm/dep/del/'+del_id,
type: 'get',
success: () => {
swal("已删除!", {
icon: 'success',
});
$(this).parent().parent().remove()
}
});
} else {
swal("取消删除!");
}
});
})
</script>
{% endblock %}
{% block content %}
<table class="text-center table table-striped table-bordered" style="margin-top: 20px">
<tr>
<td>序号</td>
<td>id</td>
<td>部门</td>
<td>描述</td>
<td>操作</td>
</tr>
{% for obj in msg %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ obj.pk }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.desc }}</td>
<td><a href={% url 'crm:depedit' obj.pk %}><i class="fa fa-pencil-square-o" aria-hidden="true">&nbsp&nbsp&nbsp</i></a>
<a class="b1" del_id="{{ obj.pk }}" style="color: red"><i class=" fa fa-remove" aria-hidden="true"></i></a></td>
</tr>
{% endfor %}
</table>
{% endblock %} ###userlist.html
{% extends 'layout.html' %}
{% load static %}
{% block js %}
<script src="{% static '/js/sweetalter.js' %}"></script>
<script> $('.b1').click(function () { swal({
title: "提示",
text: "删除后无法恢复",
icon: "warning",
buttons: true,
dangerMode: true,
})
.then((willDelete) => {
let del_url = $(this).attr('del_url');
if (willDelete) {
$.ajax({
url: del_url,
type: 'get',
success: () => {
swal("已删除!", {
icon: 'success',
});
$(this).parent().parent().remove()
}
});
} else {
swal("取消删除!");
}
});
})
</script>
{% endblock %}
{% block content %}
<table class="text-center table table-striped table-bordered" style="margin-top: 20px">
<tr>
<td>序号</td>
<td>id</td>
<td>姓名</td>
<td>年龄</td>
{# <td>密码</td>#}
<td>部门</td>
<td>描述</td>
<td>操作</td>
</tr>
{% for obj in msg %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ obj.pk }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.age }}</td>
<td>{{ obj.dep }}</td>
<td>{{ obj.desc }}</td>
{% if obj.age %}
<td><a href={% url 'crm:useredit' obj.pk %}><i class="fa fa-pencil-square-o" aria-hidden="true">&nbsp&nbsp&nbsp</i></a>
<a class="b1" del_url="{% url 'crm:userdel' obj.pk %}" style="color: red"><i
class=" fa fa-remove" aria-hidden="true"></i></a></td>
{% else %}
<td><a href={% url 'crm:depedit' obj.pk %}><i class="fa fa-pencil-square-o" aria-hidden="true">&nbsp&nbsp&nbsp</i></a>
<a class="b1" del_url="{% url 'crm:depdel' obj.pk %}" style="color: red"><i
class=" fa fa-remove" aria-hidden="true"></i></a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% endblock %} ###edit-add.html
{% extends 'layout.html' %}
{% block content %}
<div class="container col-lg-4 col-md-offset-3" style="margin-top: 30px;">
<form class="form-horizontal" method="post" novalidate>
{% csrf_token %}
{% for obj in form_obj %}
<div class="form-group {% if obj.errors %}has-error{% endif %}">
<label for="{{ obj.id_for_label }}"
class="col-sm-2 control-label">{{ obj.label }}</label>
<div class="col-sm-10">
{{ obj }}
<span class="help-block has-error">{{ obj.errors.0 }}</span>
</div>
</div>
{% endfor %}
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">保存</button>
</div>
</form>
</div>
{% endblock %}

crm-1的更多相关文章

  1. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  2. SAP CRM 性能小技巧

    导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...

  3. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  4. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  5. SAP CRM 显示消息/在消息中进行导航

    向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...

  6. Dynamics CRM 2015-Data Encryption激活报错

    在CRM的日常开发中,Data Encryption经常是不得不开启的一个功能.但是有时,我们可能遇到一种情况,Organization导入之后,查看Data Encryption是已激活的状态,但是 ...

  7. SAP CRM 客户控制器与数据绑定

    当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入客户控制器(Custom Controller)(译者注:SAP CRM客户端中,不同地方的Custom Controller会翻译为“客 ...

  8. SAP CRM BOL编程基础,代码+详细注释

    网络上可以找到一些使用BOL查询.维护数据的DEMO,但几乎都是单纯的代码,缺乏说明,难以理解.本文除了代码外,还给出了详细的注释,有助于理解BOL编程中的一些基本概念. 这是一篇翻译的文章,你可能会 ...

  9. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  10. SAP CRM 7.0中的BOL(Business Object Layer)

    业务对象层(BOL)和通用交互层(GenIL)属于业务层. 业务对象层:   在CRM WebClient会话运行期间,业务对象层存储业务对象的数据以及它们属性和关系的定义. 通用交互层 通用交互层将 ...

随机推荐

  1. Specify Action Settings 指定按钮设置

    In this lesson, you will learn how to modify Action properties. The ClearTasks Action will be used. ...

  2. JavaScript 使用new关键字调用函数

    使用new关键字调用函数 test.js 代码如下 function Person(name, age, obj) { var o = new Object(); o.name = name; o.a ...

  3. arcgis api 4.x for js 基础工具篇之测距测面

    前言 在搭建好WebGIS应用框架的时候,相信大家首先开发的都会是基础功能,此篇文章我们主要讲述的是“测距”."测面"功能. 注* 在测量单位中常规都是基于"平面坐标系& ...

  4. iOS与JS交互-WKWebView

    iOS移动端应用中,一般都会嵌入网页,在网页中处理的结果需要反馈给iOS让移动端做出相应的处理(例如页面跳转), 1.webview的配置 2.代理方法中拿到事件进行处理 二.JS中的配套出发事件 当 ...

  5. Thymeleaf对象的使用:数字对象

    Thymeleaf主要使用 org.thymeleaf.expression.Numbers 类处理数字,在模板中使用 #numbers 对象来处理数字. 开发环境:IntelliJ IDEA 201 ...

  6. 漏洞扫描与分析-Nessus-8.7.2最新版-安装-部署-使用

    漏洞扫描与分析-Nessus 2019/10/10 Chenxin 简介 官网 https://zh-cn.tenable.com/ 产品 https://zh-cn.tenable.com/prod ...

  7. Hadoop、storm和Spark Streaming简单介绍(非原创)

    文章大纲 一.Hadoop是什么二.storm是什么三.Spark Streaming是什么四.Spark与storm比较五.参考文章   一.Hadoop是什么 1. 简介 Hadoop是一个由Ap ...

  8. 教你两招用纯CSS写Tab切换

    说到Tab切换,你可能首先想到的就是使用jQuery,短短几行代码就可以轻松搞定一个Tab切换. 而今天所要分享的,是使用 0 行JS代码来实现Tab切换! 具体效果如下:   Tab切换 方法一:模 ...

  9. PM8909 linear charger硬件概述

    电池充电是由qpnp-vm-bus.c(电池驱动BMS)和qpnp-linear-charger.c(线性充电器)组成: SMMB charger:Switch-ModeBattery Charger ...

  10. 一个版本烧录过程中记录:fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img

    关键词:dd.fdisk.mkfs.ext4.make_ext4fs.img2simg.simg2img等等. 一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和k ...