crm-1
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">   </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">   </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">   </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的更多相关文章
- 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 数据库 ...
- SAP CRM 性能小技巧
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...
- SAP CRM 显示消息/在消息中进行导航
向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...
- Dynamics CRM 2015-Data Encryption激活报错
在CRM的日常开发中,Data Encryption经常是不得不开启的一个功能.但是有时,我们可能遇到一种情况,Organization导入之后,查看Data Encryption是已激活的状态,但是 ...
- SAP CRM 客户控制器与数据绑定
当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入客户控制器(Custom Controller)(译者注:SAP CRM客户端中,不同地方的Custom Controller会翻译为“客 ...
- SAP CRM BOL编程基础,代码+详细注释
网络上可以找到一些使用BOL查询.维护数据的DEMO,但几乎都是单纯的代码,缺乏说明,难以理解.本文除了代码外,还给出了详细的注释,有助于理解BOL编程中的一些基本概念. 这是一篇翻译的文章,你可能会 ...
- SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据
这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...
- SAP CRM 7.0中的BOL(Business Object Layer)
业务对象层(BOL)和通用交互层(GenIL)属于业务层. 业务对象层: 在CRM WebClient会话运行期间,业务对象层存储业务对象的数据以及它们属性和关系的定义. 通用交互层 通用交互层将 ...
随机推荐
- Python 从入门到进阶之路(六)
之前的文章我们简单介绍了一下 Python 的面向对象,本篇文章我们来看一下 Python 中异常处理. 我们在写程序时,有可能会出现程序报错,但是我们想绕过这个错误执行操作.即使我们的程序写的没问题 ...
- 函数式接口 & lambda表达式 & 方法引用
拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...
- Java 添加Word文本水印、图片水印
水印是一种常用于各种文档的声明.防伪手段,一般可设置文字水印或者加载图片作为水印.以下内容将分享通过Java编程给Word文档添加水印效果的方法,即 文本水印 图片水印 使用工具:Free Spire ...
- 案例:使用dbms_xplan.display_cursor无法获取执行计划
案例:使用dbms_xplan.display_cursor无法获取执行计划 环境:RHEL 6.5 + Oracle 11.2.0.4 在一次测试中发现使用dbms_xplan.display_cu ...
- [browser srceen]、很多未知望大神告知、简单写了个拖拽
未知作用的有.如果也有像我1样好奇的小伙伴了解了麻烦告知 // console.log(window.screen.availWidth);//未知效果 // console.log(window.s ...
- boostrap 学习笔记
bootstrap : 是全球最受欢迎的前端组件库,用于开发响应式布局.移动设备优先的 WEB 项目. 用于项目样式的快速搭建,真的是..特别快.. 随便找两个cdn引用就能使用了. https:// ...
- C#(1)运用C#实现一键从Word文档转换TXT文本的功能
有想直接从Word转TXT文本的可以看看,懒得复制粘贴的也可以使用下,方便而快捷!! 首先打开vs2012创建一个简单的form窗体: 里面主要的就是一个存放Word文档的button和一个执行的bu ...
- C# 中使用 Redis 简单存储
Redis 是一个开源的使用 ANSI C语言编写的支持网络.可基于内存也可持久化的日志型.Key-Value 数据库. 常用它来存储缓存数据,能非常轻松的实现缓存过期刷新机制. 多种语言都可以连接到 ...
- 一行代码在Linux服务器上搭建基于.Net Core的博客
如果你有一台Linux服务器(CentOS7+ 或者 Ubuntu 16.04+)可以使用以下命令快速搭建一个博客. curl http://cdn.zkeasoft.com/zkeacms-blog ...
- tornado的IOLoop.instance()方法和IOLoop.current()方法区别
在使用tornado时,经常有人疑惑IOLoop.instance()方法和IOLoop.current()方法的区别是什么. IOLoop.instance() 返回一个全局 IOLoop实例. 大 ...