為什麼要這樣做咧??

因為我們不想要使用舊式的from表單來送整頁的資料,每次都重新整理

讓使用者感覺到操作非常的麻煩,不順暢

如果他可以點一個欄位就修改一個欄位,這是最理想的操作方式了

以下就分各部份來說明如何來實現這個動作





在HTML部分如下:


如果是Text欄位(一般的文字、數字欄位)

<td class="ClickShowInfo" row_id="{{ row.id }}" field_name="telphone">
    <a id="show_part_telphone_{{ row.id }}">
    	{{ row.telphone|default_if_none:"" }}
    </a>
    <input
	id="edit_part_telphone_{{ row.id }}" 
    type="text" class="BlurUpdateInfo" style="display: none;"
    field_type="str"
    row_id="{{ row.id }}"
    field_name="telphone"
    table_name="UserProfile"
    old_value="{{ row.telphone|default_if_none:"" }}"
    value="{{ row.telphone|default_if_none:"" }}"/>
</td>


如果是Textarea欄位(如說明欄位)

<td class="ClickShowInfo" row_id="{{ row.id }}" field_name="memo">
	<a id="show_part_memo_{{ row.id }}">
    	{{ row.memo|linebreaks|default_if_none:"" }}
    </a>
	<textarea
	id="edit_part_memo_{{ row.id }}" 
    class="BlurUpdateInfo" style="display: none;"
    field_type="str"
    row_id="{{ row.id }}"
    field_name="memo"
    table_name="UserProfile"
    old_value="{{ row.memo|default_if_none:"" }}"/>
	cols="40" rows="5">{{ row.memo|default_if_none:"" }}</textarea>
</td>


如果是Select欄位(一般用在ForeignKey欄位,例如縣市、單位等等)

<td class="ClickShowInfo" row_id="{{ row.id }}" field_name="place">
	<a id="show_part_memo_{{ row.id }}">
    	{{ row.place.name }}
    </a>
	<select class="ClickShowInfo"
	id="edit_part_place_{{ row.id }}" 
    class="BlurUpdateInfo" style="display: none;"
    field_type="select"
    row_id="{{ row.id }}"
    field_name="place"
    table_name="UserProfile"
    old_value="{{ row.place.id }}">
		<option value="" {% if not row.place %}selected="selected"{% endif %}>
			請選擇
		</option>
		{% for p in places %}
			<option value="{{ p.id }}" {% ifequal row.place p %}selected="selected"{% endifequal %>
				{{ p.name }}
			</option>
		{% endfor %}
	</select>
</td>





然後再JavaScript部分開始整理所需的資料,如下:


//進行(顯示部分-輸入框)物件切換
function ClickShowInfo(){
    var $obj = $(this);
    var field_name = $obj.attr('field_name');
    var row_id = $obj.attr('row_id');
    $('#show_part_'+field_name+"_"+row_id).hide();
    $('#edit_part_'+field_name+"_"+row_id).show().focus();
}

//送資料
function BlurUpdateInfo(){
	//整理欄位資訊
    var $obj = $(this);
    var row_id = $obj.attr('row_id');
    var field_type = $obj.attr('field_type');
    var field_name = $obj.attr('name');
    var table_name = $obj.attr('table_name');
    var value = $obj.attr('value');
    var old_value = $obj.attr('old_value');
    var int_check=/^-?[0-9]*$/;
    var float_check=/^[1-9]d*.d*|0.d*[1-9]d*$/;
    var date_check=/^(([1-9]\d{0,3}|0)\-\d{2}\-\d{2})|(([1-9]\d{0,3}|0)\.\d{2}\.\d{2})|(([1-9]\d{0,3}|0)\/\d{2}\/\d{2})$/;
    var email_check=/^[a-z0-9][-a-z0-9\.]*@([a-z0-9-]+\.)+[a-z]+$/;
    //檢查各種格式是否正確
    if (field_type=='int' && value){
    	if(!(int_check.test(value))){
            var message = field_name + '須為整數!';
            alert(message);
            return false;
        }
    }
    if (field_type=='float' && value){
    	if(!(float_check.test(value))){
            var message = field_name + '須為數字!';
            alert(message);
            return false;
        }
    }
    if (field_type=='date' && value){
    	if(!(date_check.test(value))){
            var message = field_name + '須為日期格式(如2013-01-19)!';
            alert(message);
            return false;
        }
    }
    if (field_type=='email' && value){
    	if(!(email_check.test(value))){
            var message = field_name + '須為Email格式!';
            alert(message);
            return false;
        }
    }
    //送資料到views.py
    if (value!=old_value){
        $.ajax({ url:"/your_app_name/ajax/", type: "POST", data:{submit: "BlurUpdateInfo",
            row_id: row_id, field_name: field_name, table_name: table_name,
            field_type: field_type, value: value
        }, dataType:"json", success:function(data){
            if(data["status"]){
            	//修改html資訊
                $('#edit_part_'+field_name+"_"+row_id).attr('value', data['return_value']);
                $('#edit_part_'+field_name+"_"+row_id).attr('old_value', data['return_value']);
                $('#show_part_'+field_name+"_"+row_id).html(data['return_value_ch']);
            } else {
            	//若修改失敗要把被修改的值改為原資料值
                $('#edit_part_'+field_name+"_"+row_id).attr('value', old_value);
                alert(data['error_message']);
            }
        }});
    }
    //將顯示物件切換回來
    $('#show_part_'+field_name+"_"+row_id).show();
    $('#edit_part_'+field_name+"_"+row_id).hide();
}


$(document).ready(function(){
	$('.ClickShowInfo').click(ClickShowInfo);
	$('.BlurUpdateInfo').blur(BlurUpdateInfo);
}





再來就是Django的部分了

第一部分是urls.py


urlpatterns = patterns('apps.project.views',
    (r'^ajax/$', 'AJAX'),
)




第二部分是views.py


def AJAX(R):
    submit = R.GET.get('submit', '')
    html = False
    if not submit: submit = R.POST.get('submit', '')

    if 'BlurUpdateInfo' == submit:
        result = BlurUpdateInfo(R)

    else:
        result = {'status': False, 'message': u'未指定方法'}

    if html: return HttpResponse(result)
    else: return HttpResponse(json.dumps(result))


def BlurUpdateInfo(R):
    row_id = R.POST.get('row_id')
    field_name = R.POST.get('field_name')
    field_type = R.POST.get('field_type')
    table_name = R.POST.get('table_name')
    value = R.POST.get('value')
    return_value = value
    return_value_ch = value
    if table_name == 'UserProfile':
    	row = UserProfile.objects.get(id=row_id)

    if field_type == 'float':
    	if value:
    		value = str(value)
    	else:
    		value = '0'
    		return_value = '0'
    		return_value_ch = '0'
    elif field_type == 'int':
    	if not value:
    		value = 0
    		return_value = 0
    		return_value_ch = 0
    elif field_type == 'select':
    	if value:
	    	if field_name == 'place':
	    		value = Place.objects.get(id=value)
	    		return_value = value.id
	    		return_value_ch = value.name
	    else:
	    	value = None
	    	return_value = ''
    		return_value_ch = '請選擇'

    if not value:
    	value = None
    
    setattr(row, field_name, value)
    row.save()

    return {'status': True, 'return_value': return_value}





好了,大致上就是這樣,當然還是要依照你的資歷格式或需要輸入的資料來進行微調

但是萬變不離其宗阿



arrow
arrow
    全站熱搜

    嘎抓強 發表在 痞客邦 留言(0) 人氣()