3 django系列之Form表單在前端web界面渲染與入庫保存


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM