為什麼要這樣做咧??
因為我們不想要使用舊式的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}
好了,大致上就是這樣,當然還是要依照你的資歷格式或需要輸入的資料來進行微調
但是萬變不離其宗阿
全站熱搜
留言列表