author: 溫柔易淡(Leo),歡迎技術交流與拍磚
preface
我們在前端寫表單的時候,其實可以使用django自帶的forms功能來實現,特別是在處理 修改已經存在數據 的場景特別好用,下面說說他。
后台代碼
我們先從后台說起,這個流程是這樣的:當用戶查看某一個條目的詳細新的時候,我們首先獲取這個條目的詳細信息在數據庫里,然后塞入到表單里面渲染,這樣傳到前端就是這個條目的詳細信息了,用戶可以修改然后保存。
對此我們需要做的工作就是application下面創建一個form的py文件,我創建的文件名是formself,文件結構如下:
文件結構
[root@linux-node2 devops]# tree BatchM
BatchM # 項目名
├── Batch # application名字
│ ├── formself.py # form文件,自定義
formself里面的代碼如下:
from django.forms import Form,ModelForm # 導入這兩個模塊
# ModelForm把 models里到數據變成一個表單,可以用的html頁面上
from Batch import models
class ApplyUpdateForm(ModelForm):
class Meta:
model = models.WorkOrderOfUpdate # 和哪個數據庫綁定在一塊
exclude = ('email_issend','tags',) # 排除哪個字段
def __init__(self, *args, **kwargs):
# 繼承父類,后重寫自己的類
super(ApplyUpdateForm, self).__init__(*args, **kwargs)
for field_name in self.base_fields: # 遍歷每一個字段
field = self.base_fields[field_name]
field.widget.attrs.update({'class': 'form-control'}) # 給每一個輸入框添加上一個樣式
我們在看看views里面的代碼
from Batch import models
from Batch import formself #導入剛才我們自定義的form文件
def apply_detail(request,order_id):
'''
顯示一個工單詳情
:param request:
:param order_id: 工單ID
:return:
'''
order_detail = models.WorkOrderOfUpdate.objects.get(OrderId=order_id) # 取出這個條目的所有信息
form = formself.ApplyUpdateForm(instance=order_detail) # 把這個條目的信息塞入到表單里,instance就是從哪個對象里面獲取數據
return render(request,'update_order_detail.html',{'selfforms':form}) # 把做好的表單返回到前端html文件里面通過form這個對象。
我們再看看html文件代碼
'''省去不相關的代碼
{% block page_content %} # 使用jinja修改母板的內容
<a href="/BatchM/apply_update.html/search/"><button class="btn btn-default" >返回上一頁</button></a><br><br>
{{ selfforms }} # 寫上這個,就能夠自動在前端展示弄好的表單了。
{% endblock %}
好了,展示功能搞定了,還可以在這基礎之上做一個保存功能,即在用戶修改完表單的內容后,提交它,后端把這些表單的數據入庫。我們就需要在后端添加幾行代碼,主要針對post請求處理,前端只添加需要<form> </form> <input type='submit' value=‘提交’>
2個類型標簽,申明提交地址,提交方法為post,就行了。
通過form保存數據
后端view代碼如下:
from Batch import models
from Batch import formself #導入剛才我們自定義的form文件
def apply_detail(request,order_id):
'''
顯示一個工單詳情
:param request:
:param order_id: 工單ID
:return:
'''
if request.method == "GET":
order_detail = models.WorkOrderOfUpdate.objects.get(OrderId=order_id) # 取出這個條目的所有信息
form = formself.ApplyUpdateForm(instance=order_detail) # 把這個條目的信息塞入到表單里,instance就是從哪個對象里面獲取數據
render(request,'update_order_detail.html',{'selfforms':form}) #把做好的表單返回到前端html文件里面通過form這個對象。
elif request.method == "POST": # 處理提交上來的數據
form_obj = getattr(formself,ApplyUpdateForm) # ApplyUpdateForm是在formself定義好的類
fm_result = form_obj(request.POST) # 把提交的數據塞入剛才的對象里面
if fm_result.is_valid(): # 如果數據與數據庫表之間能夠匹配,也就是提交的表單內容正確
fm_result.save() # 那么就入庫。
return return HttpResponseRedirect('/')
else:
return HttpResponse('信息不全')
前端代碼就不在贅述了。
至此,form的簡單介紹到此結束,更多功能可以參考官網地址:https://docs.djangoproject.com/en/1.10/topics/forms/