十二章、學員報名流程開發 2
12.1.學員報名合同和證件信息上傳
功能:
- 必須勾選報名合同協議
- 必須上傳個人證件信息
- 最多只能上傳三個文件
- 文件大小2M以內
- 列出已上傳文件
(1)crm/urls.py
urlpatterns = [ #上傳個人證件信息 url(r'^enrollment/(\d+)/fileupload/$', views.enrollment_fileupload,name='enrollment_fileupload'), ]
(2)crm./views.py
建一個上傳文件的文件夾

import os,json from django.views.decorators.csrf import csrf_exempt from django import conf @csrf_exempt def enrollment_fileupload(request,enrollment_id): '''學員報名文件上傳''' enrollment_upload_dir = os.path.join(conf.settings.CRM_FILE_UOLOAD_DIR,enrollment_id) #第一次上傳圖片就創建目錄,學員上傳第二章圖片的時候,會判斷目錄是否已經存在 #因為如果目錄存在還mkdir就會報錯,所以這里要做判斷 if not os.path.isdir(enrollment_upload_dir): os.mkdir(enrollment_upload_dir) #獲取上傳文件的對象 file_obj = request.FILES.get('file') #最多只允許上傳3個文件 if len(os.listdir(enrollment_upload_dir)) <= 3: #把圖片名字拼接起來(file.name:上傳的文件名字) with open(os.path.join(enrollment_upload_dir,file_obj.name),'wb') as f: for chunks in file_obj.chunks(): f.write(chunks) else: return HttpResponse(json.dumps({'status':False,'err_msg':'最多只能上傳三個文件'})) return HttpResponse(json.dumps({'status':True,}),) def enrollment(request,enrollment_id): '''學員在線報名表地址''' enrollment_obj = models.StudentEnrollment.objects.get(id=enrollment_id) if request.method == 'POST': customer_form = form.CustomerForm(instance=enrollment_obj.customer,data=request.POST) if customer_form.is_valid(): customer_form.save() return HttpResponse("你已成功提交報名信息,請等待審核,歡迎加入仙劍奇俠傳") else: customer_form = form.CustomerForm(instance=enrollment_obj.customer) # 列出學員已上傳的文件 upload_files = [] enrollment_upload_dir = os.path.join(conf.settings.CRM_FILE_UOLOAD_DIR, enrollment_id) if os.path.isdir(enrollment_upload_dir): upload_files = os.listdir(enrollment_upload_dir) return render(request,'crm/enrollment.html',locals())
(3)settings.py
#學員個人信息圖片上傳路徑 CRM_FILE_UOLOAD_DIR = os.path.join(BASE_DIR,'crm/upload_files/enrollment_data',)
(4)crm/enrollment.html
css和js放到statics下面

{#templates/crm/enrollment.html#} {% extends 'index.html' %} {% load staticfiles %} {% block extra-css %} <link rel="stylesheet" href="{% static 'plugins/dropzone/dropzone.css' %}"> {% endblock %} {% block body %} <div class="container"> <h3>仙劍奇俠傳|學員報名</h3> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">學員在線報名</h3> </div> <div class="panel-body"> <form class="form" method="post" onsubmit="return BeforeFormSubmit(this)"> {% csrf_token %} {% for field in customer_form %} <div class="form-group col-lg-6"> <label class="col-sm-2 control-label">{{ field.label }}</label> <div class="col-sm-10"> {{ field }} <span style="color: red;">{{ field.errors.0 }}</span> </div> </div> {% endfor %} <div class="form-group col-lg-6"> <label class="col-sm-2 control-label">報名班級</label> <div class="col-sm-10"> {{ enrollment_obj.class_grade }} </div> </div> <div class="form-group col-lg-6"> <label class="col-sm-2 control-label">學費</label> <div class="col-sm-10"> {{ enrollment_obj.class_grade.course.price }} </div> </div> <hr> <pre style="height: 400px;">{{ enrollment_obj.class_grade.contract_template.content }}</pre> <input type="checkbox" name="contract_agreed">我已認真閱讀,無條件同意。 {# <div class="col-sm-offset-11 col-sm-2">#} <input style="padding: 10px;" type="submit" class="btn btn-success col-sm-offset-11" value="提交"> {# </div>#} </form> <br> <p style="color: blueviolet;">已上傳文件列表</p> <ul id="uploaded_files"> {% for file in upload_files %} <li>{{ file }}</li> {% endfor %} </ul> <form id="myAwesomeDropzone" action="{% url 'enrollment_fileupload' enrollment_obj.id %}" class="dropzone"> <div class="fallback"> <input name="file" type="file" multiple /> </div> </form> </div> <div class="panel-footer"><a href="http://www.cnblogs.com/derek1184405959/">zhang_derek</a></div> </div> </div> <script> function BeforeFormSubmit(ele) { $(":disabled").removeAttr("disabled"); if ($("#uploaded_files").children().length ==0){ alert("請上傳個人證件信息!") return false } if (!$("input[name='contract_agreed']").prop("checked")){ alert("必須勾選仙劍奇俠傳合同協議") return false } //return false; } </script> {% endblock %} {% block extra-js %} <script src="{% static 'plugins/dropzone/dropzone.js' %}"></script> <script> // "myAwesomeDropzone" is the camelized version of the HTML element's ID Dropzone.options.myAwesomeDropzone = { paramName: "file", // The name that will be used to transfer the file maxFilesize: 2, // MB maxFiles:2, parallelUploads:1, accept: function(file, done) { if (file.name == "justinbieber.jpg") { done("Naha, you don't."); } else { done(); } } }; $(function() { // Now that the DOM is fully loaded, create the dropzone, and setup the // event listeners // Prevent Dropzone from auto discovering this element: Dropzone.options.myAwesomeDropzone = false; var myDropzone = new Dropzone("#myAwesomeDropzone"); myDropzone.on("success", function(file,response) { /* Maybe display some more file information on your page */ console.log("completet", file, response); var response = JSON.parse(response); if (!response.status){ alert(response.err_msg); }else { $("#uploaded_files").append("<li>"+ file.name +"</li>"); } }); }) </script> {% endblock %}
效果:
合同

上傳證件信息(直接把文件拖進去就可以了)

12.2.合同審核
(1)學員提交報名信息后,把contract_agreed改為True,並保存提交的時間

(2)提交報名信息后,就應該是等待審核狀態


(3)已經生產報名鏈接的,點“下一步”,跳轉“合同審核”頁面
- 沒有生產報名鏈接的點“下一步”,生產報名連接
- 已經生成過的,點“下一步”,會報錯,因為贏生成過了鏈接
- 所以在這里要抓住這個異常,生成過的點“下一步”,應該是跳到“合同審核”頁面

抓住異常
@login_required def stu_enrollment(request): '''學員報名''' customers = models.CustomerInfo.objects.all() class_lists = models.ClassList.objects.all() if request.method == 'POST': #獲取提交的客戶id和班級id,然后生成報名鏈接 customer_id = request.POST.get('customer_id') class_grade_id = request.POST.get('class_grade_id') try: enrollment_obj = models.StudentEnrollment.objects.create( customer_id = customer_id, class_grade_id = class_grade_id, consultant_id = request.user.userprofile.id ) #已經生成過報名鏈接,就進入審核頁面 except IntegrityError as e: enrollment_obj = models.StudentEnrollment.objects.get(customer_id = customer_id,class_grade_id = class_grade_id) if enrollment_obj.contract_agreed: return redirect("/crm/stu_enrollment/%s/contract_audit/"% enrollment_obj.id) #生成鏈接返回到前端 enrollment_link = "http://localhost:8000/crm/enrollment/%s"% enrollment_obj.id return render(request,'crm/stu_enrollment.html',locals())
合同審核
(4)crm/urls.py
#合同審核 url(r'^stu_enrollment/(\d+)/contract_audit/$', views.contract_audit,name='contract_audit'),
(5)crm/views.py
- 獲取到學員信息表單
- 勾選審核后,提交
- 后台:把學生加到對應班級里面
- 把學生的狀態改成報名
@login_required def contract_audit(request,enrollment_id): '''合同審核''' enrollment_obj = models.StudentEnrollment.objects.get(id=enrollment_id) if request.method == 'POST': enrollment_form = form.EnrollmentForm(instance=enrollment_obj,data=request.POST) if enrollment_form.is_valid(): enrollment_form.save() stu_obj = models.Student.objects.get_or_create(customer=enrollment_obj.customer)[0] #m2m, 添加班級 stu_obj.class_grades.add(enrollment_obj.class_grade_id) stu_obj.save() #改變報名 enrollment_obj.customer.status = 1 enrollment_obj.save() return redirect("/kingadmin/crm/customerinfo/%s/change"%enrollment_obj.customer.id) else: #拿到客戶信息的表單 customer_form = form.CustomerForm(instance=enrollment_obj.customer) enrollment_form = form.EnrollmentForm(instance=enrollment_obj) return render(request,'crm/contract_audit.html',locals())
(6)crm/contract_audit.html
{#crm/contract_audit.html#} {% extends 'index.html' %} {% block right-content-container %} <h3>學員報名|合同審核</h3> <form class="form-horizontal" method="post" onsubmit="BeforeFormSubmit(this)">{% csrf_token %} {{ customer_form }} {{ enrollment_form }} <input type="submit" class="btn btn-success pull-right" value="審核通過" > </form> <script> function BeforeFormSubmit(ele) { $(":disabled").removeAttr("disabled"); } </script> {% endblock %}
