学员填写报名信息(二十三)

添加学员注册url
添加CustomerInfo字段,身份证信息,紧急联络人,性别
有些字段是只读的,填写信息的时候不能修改,因为如果设置了只读(添加属性disabled=true),提交的时候会报这些字段为空,导致提交错误
所以在前段添加了js代码,BeforeFormSubmit 在提交前去掉disable=true(因为数据库中有默认值,提交的时候就不会报错)
防止用户通过前端改html代码的方式改只读字段的信息,所以在form.py里面添加了一个自定义的验证方法(clean),如果只读字段提交的时候信息跟数据库中默认的不一样,就报错

(1)crm/urls.py

# crm/urls.py

from django.conf.urls import url,include
from crm import views

urlpatterns = [
    url(r'^$', views.dashboard,name='sales_dashboard'),
    #学员报名
    url(r'^stu_enrollment/$', views.stu_enrollment,name='stu_enrollment'),
    #学员注册
    url(r'^enrollment/(\d+)/$', views.enrollment,name='enrollment'),
]

(2)crm/models.py

CustomerInfo表 添加字段

12206509-b6fa1102cf330ba0.png
image

(3)crm/form.py

# crm/form.py

from django.forms import ModelForm
from crm import models
from django import forms

class CustomerForm(ModelForm):
    class Meta:
        model = models.CustomerInfo
        fields = "__all__"
        #不显示的字段
        exclude = ['consult_content','status','consult_courses']
        #只读的字段
        readonly_fields = ['contact_type','contact','consultant','referral_from','source']

    #django是通过“__new__”方法,找到ModelForm里面的每个字段的,然后循环出每个字段添加自定义样式
    def __new__(cls, *args, **kwargs):
        #cls.base_fields是一个元祖,里面是 所有的  【(字段名,字段的对象),(),()】
        for field_name in cls.base_fields:
            field_obj = cls.base_fields[field_name]
            #添加属性
            field_obj.widget.attrs.update({'class':'form-control'})

            if field_name in cls.Meta.readonly_fields:
                field_obj.widget.attrs.update({'disabled':'true'})
        return ModelForm.__new__(cls)

    #只读字段不让用户通过浏览器改html代码的方式改
    def clean(self):
        # 表单级别的错误
        if self.errors:
            raise forms.ValidationError(("Please fix errors before re-submit."))
        # means this is a change form ,should check the readonly fields
        if self.instance.id is not None:
            #取出只读字段,是一个字符串形式
            for field in self.Meta.readonly_fields:
                #通过反射取出字段的值(数据库里的数据)
                old_field_val = getattr(self.instance, field)
                #提交过来的数据
                form_val = self.cleaned_data.get(field)
                #如果两个数据不匹配
                if old_field_val != form_val:
                    #就提示只读字段不能修改
                    #add_error是字段级别的错误
                    self.add_error(field, "Readonly Field: field should be '{value}' ,not '{new_value}' ". \
                                   format(**{'value': old_field_val, 'new_value': form_val}))

(4)crm/views.py

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)

    return render(request,'crm/enrollment.html',locals())

(4)crm/enrollment.html

{#templates/crm/enrollment.html#}

{% extends 'index.html' %}

{% 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>

                    <div class="col-sm-offset-11 col-sm-2">
                        <input type="submit" class="btn btn-success " value="提交">
                    </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");
    }

</script>

{% endblock %}

在线报名填表页面

12206509-29d399fa58991b98.png
image

** 修改只读字段会报错**

12206509-0a4322aea7afbf2b.png
image

猜你喜欢

转载自blog.csdn.net/weixin_34266504/article/details/87636291