首页 技术 正文
技术 2022年11月9日
0 收藏 440 点赞 2,442 浏览 8081 个字

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, depurlpatterns = [
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-viewfrom django.shortcuts import render, reverse, redirect, HttpResponse
from crm import models
from django import forms
from django.forms import ValidationError
import hashlibclass 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 %}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,490
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,905
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,738
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,491
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,129
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,292