基於Form組件實現的增刪改和基於ModelForm實現的增刪改

来源:http://www.cnblogs.com/haiyan123/archive/2017/12/06/7994308.html
-Advertisement-
Play Games

一、ModelForm的介紹 應用場景: - ModelForm - 中小型應用程式。因為ModelForm是依賴於models的 - Form - 大型應用程式 * 註意事項: 二、表結構 三、基於Form組件的添加和編輯 添加:這隻是單表的添加 編輯:單表的編輯 具體基於Form組件實現的一對多 ...


一、ModelForm的介紹

ModelForm
    a.  class Meta:
            model,                           # 對應Model的
            fields=None,                     # 欄位
            exclude=None,                    # 排除欄位
            labels=None,                     # 提示信息
            help_texts=None,                 # 幫助提示信息
            widgets=None,                    # 自定義插件
            error_messages=None,             # 自定義錯誤信息(整體錯誤信息from django.core.exceptions import NON_FIELD_ERRORS)
            field_classes=None               # 自定義欄位類 (也可以自定義欄位)
            localized_fields=('birth_date',) # 本地化,如:根據不同時區顯示數據
            如:
                資料庫中
                    2016-12-27 04:10:57
                setting中的配置
                    TIME_ZONE = 'Asia/Shanghai'
                    USE_TZ = True
                則顯示:
                    2016-12-27 12:10:57
    b. 驗證執行過程
        is_valid -> full_clean -> 鉤子 -> 整體錯誤
 
    c. 字典欄位驗證
        def clean_欄位名(self):
            # 可以拋出異常
            # from django.core.exceptions import ValidationError
            return "新值"
    d. 用於驗證
        model_form_obj = XXOOModelForm()
        model_form_obj.is_valid()
        model_form_obj.errors.as_json()
        model_form_obj.clean()
        model_form_obj.cleaned_data
    e. 用於創建
        model_form_obj = XXOOModelForm(request.POST)
        #### 頁面顯示,並提交 #####
        # 預設保存多對多
            obj = form.save(commit=True)
        # 不做任何操作,內部定義 save_m2m(用於保存多對多)
            obj = form.save(commit=False)
            obj.save()      # 保存單表信息
            obj.save_m2m()  # 保存關聯多對多信息
 
    f. 用於更新和初始化
        obj = model.tb.objects.get(id=1)
        model_form_obj = XXOOModelForm(request.POST,instance=obj)
        ...
 
        PS: 單純初始化
            model_form_obj = XXOOModelForm(initial={...})

 應用場景:
            - ModelForm - 中小型應用程式。因為ModelForm是依賴於models的
            - Form      - 大型應用程式  *

註意事項:

註意事項:
            - 1. 類 
                  class Foo(ModelForm):
                    class Meta:
                        # model = models.Role
                        # fields = "__all__"
                        # fields = ['caption',]
                        # exclude = ['catpion']
                        model = models.UserType
                        fields = "__all__"

                        error_messages = {
                            'title':{'required':'名稱不能為空','invalid':'格式錯誤'}
                        }
                        widgets = {
                            'title':wd.TextInput(attrs={'class':'c1'})
                        }
                
            - 2. 添加
                 GET:
                    form = Foo()
                 POST:
                    form = Foo(data=request.POST)
                    form.is_valid()
                    form.cleaned_data
                    form.erros
                    form.save()
            - 3. 修改
                 GET:
                    form = Foo(instance=obj)
                 
                 POST:
                    form = Foo(instance=obj,dat=request.POST)
                    ...
                    form.save()
                    

二、表結構

from django.db import models

# Create your models here.
class UserInfo (models.Model):
    username = models.CharField(max_length=32)
    email = models.EmailField(max_length=32)
    ut = models.ForeignKey("UserType")

class UserType (models.Model):
    title = models.CharField(max_length=32)
    roles = models.ManyToManyField(to="Roles")
    def __str__(self):
        return self.title

class Roles(models.Model):
    caption = models.CharField(max_length=32)
    def __str__(self):
        return self.caption

三、基於Form組件的添加和編輯

添加:這隻是單表的添加

from django.forms import Form, fields,widgets,ModelForm
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
# Create your views here.
class RoleForm(Form):
    '''利用Form'''
    caption = fields.CharField(required=True,error_messages={"required":True})

def role(request):
    role_obj = models.Roles.objects.all()
    print(role_obj)
    return render(request, "role.html",{"role_obj":role_obj})

# 基於Form實現的
def role_add(request):
    '''添加角色'''
    if request.method=="GET":
        form = RoleForm()
        return render(request,"role_add.html",{"form":form})
    else:
        form = RoleForm(data=request.POST)
        if form.is_valid():
            print("zzzzz")
            caption = form.cleaned_data.get("caption")
            models.Roles.objects.create(caption=caption)
            # models.Roles.objects.create(**form.cleaned_data)
            return redirect("/role/")
        else:
            return render(request,"role_add.html",{"form":form})

編輯:單表的編輯

#基於Form實現的編輯
def role_edit(request,nid):
    obj = models.Roles.objects.filter(id=nid).first()
    print(obj.caption)
    if not obj :
        return HttpResponse("頁面不存在")
    if request.method=="GET":
        form = RoleForm(initial={"caption":obj.caption})   #編輯的時候需要一個instance,讓instance=一個你要編輯的那個對象
    else:
        form = RoleForm(data = request.POST)
        if form.is_valid():
            models.Roles.objects.filter(id=nid).update(**form.cleaned_data)
            return redirect("/role/")
    return render(request,"role_edit.html",{"form":form})

具體基於Form組件實現的一對多添加或者多對多添加編輯詳見博客http://www.cnblogs.com/haiyan123/p/7816877.html

四、基於ModelForm的添加和編輯

添加:單表的添加

# 基於ModelForm的添加
class RoleModelForm(ModelForm):
    class Meta:   #這個類必須寫,而且名字必須是這個
        model = models.Roles   #這個model也是固定的,註意不加s,
        fields = "__all__"   #代表所有的欄位,但是你也可以指定單個的欄位


def role_add(request):
    if request.method == "GET":
        form = RoleModelForm()
        return render(request,"role_add.html",{"form":form})
    else:
        form = RoleModelForm(data=request.POST)
        if form.is_valid():
            form.save()   #這裡直接可以用save方法,就把數據創建了
            return redirect("/role/")
        else:
            return render(request,"role_add.html",{"form":form})

添加:多對多的添加,一堆多的提添加也是一樣

# 多對多的添加
def usertype(request):
    user_type_list = models.UserType.objects.all()
    return render(request,"usertype.html",{'user_type_list':user_type_list})

class UserTypeModelForm(ModelForm):
    title = fields.CharField(max_length=6,required=True,widget=widgets.Textarea)   #這個欄位是臨時添加的,
    # 也就是說modelForm也可以用Form的方式。
    # 也可以以這樣的方式新增欄位, 如果有就覆蓋,沒有就增加;像現在這種情況就是吧下麵的給覆蓋了,當然沒有上面的這個就用下麵的了

    class Meta:
        model = models.UserType
        fields = "__all__"

        error_messages = {
            "title":{"required":"用戶名不能為空","invalid":"郵箱格式不一致"}
        }
        widgets = {
            "title":widgets.TextInput(attrs={"class":"c1"})
        }

def usertype_add(request):
    '''多對多的添加'''
    if request.method=="GET":
        modelform = UserTypeModelForm()
        return render(request,"usertype_add.html",{"modelform":modelform})
    else:
        modelform = UserTypeModelForm(data=request.POST)
        if modelform.is_valid():
            modelform.save()   #也可以用save來實現,就連關係表的欄位也都添加了
            return redirect("/usertype/")
        else:
            return render(request, "usertype_add.html", {"modelform": modelform})

編輯:單表的編輯

# 基於modelForm實現的編輯
def role_edit(request,nid):
    obj = models.Roles.objects.filter(id=nid).first()
    if not obj :
        return HttpResponse("頁面不存在")
    if request.method=="GET":
        form = RoleModelForm(instance=obj)   #編輯的時候需要一個instance,讓instance=一個你要編輯的那個對象
    else:
        form = RoleModelForm(data = request.POST,instance=obj)
        if form.is_valid:
            form.save()
            return redirect("/role/")
    return render(request,"role_edit.html",{"form":form})

編輯:多對多的編輯

# 多對多的編輯
def usertype(request):
    user_type_list = models.UserType.objects.all()
    return render(request,"usertype.html",{'user_type_list':user_type_list})

class UserTypeModelForm(ModelForm):
    title = fields.CharField(max_length=6,required=True,widget=widgets.Textarea)   #這個欄位是臨時添加的,
    # 也就是說modelForm也可以用Form的方式。
    # 也可以以這樣的方式新增欄位, 如果有就覆蓋,沒有就增加;像現在這種情況就是吧下麵的給覆蓋了,當然沒有上面的這個就用下麵的了

    class Meta:
        model = models.UserType
        fields = "__all__"

        error_messages = {
            "title":{"required":"用戶名不能為空","invalid":"郵箱格式不一致"}
        }
        widgets = {
            "title":widgets.TextInput(attrs={"class":"c1"})
        }


def usertype_edit(request,nid):
    #查出當前類型用戶對應的角色
    obj = models.UserType.objects.filter(id =nid).first()
    if not obj:
        return HttpResponse("頁面不存在")
    if request.method =="GET":
        form = UserTypeModelForm(instance=obj)
        return render(request,"usertype_edit.html",{"form":form})
    else:
        form = UserTypeModelForm(instance=obj,data=request.POST)
        if form.is_valid():
            form.save()
            return redirect("/usertype/")
    return render(request,"usertype_edit.html",{"form":form})

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 輸入校驗章節目錄 輸入校驗概述 客戶端校驗 伺服器端校驗 手動編程校驗 重寫validate方法 重寫validateXxx()方法 輸入校驗流程 校驗框架校驗 Struts2 內置的校驗器 常用的內置校驗器的配置 客戶端校驗 伺服器端校驗 重寫validate方法 重寫validateXxx ...
  • websocket應用 手動實現的websocket 你所見過的websocket 你一定見過在網站中,有一個游客聊天的聊天框,比如人人影視。這個聊天框是如何實現即時通訊的呢,就是用到了websocket 你可以打開瀏覽器的network,會看到有個ws://xxxxx,這就代表了是websocke ...
  • ASCII表中的有些字元是列印不出來的,那麼怎樣表示這些無法列印的字元呢? C提供了3種表示方法. 一: 直接使用ASCII碼 二: 使用特殊的符號序列, 即轉義字元. 三: C90支持使用十六進位形式表示字元常量.(在這種形式中,反斜杠後跟一個x或X,再加上1到3位十六進位數字) 轉義字元 ASC ...
  • 1.在eclipse中用maven創建項目,右鍵new>>Maven Project 2.點擊next繼續 3.點擊next繼續,選擇maven-archetype-webapp, 4.點擊next繼續,填寫Group id和Artifact id, Version預設,Package可以不填 5. ...
  • 父類和子類的轉換 向上轉型: Father f1 = new son(); 向下轉型: son f2= (son)f1; 代碼如下: 父類 子類 主程式 ...
  • 這是因為切換成了java面板的原因 因為之前有切換到過 java project 項目,所以才轉到了這個面板,之後如果不手動改即便是用javaee也會是這個面板,因而用起來不方便 解決方法: 切換到javaee面板就好了 這樣的話用起來控制台等方面就更加靈活了 ...
  • 最近在學習多線程,題目源自 MoreWindows先生的 《秒殺多線程第一篇》(http://blog.csdn.net/morewindows/article/details/7392749) 題目摘錄: 第五題(Google面試題) 有四個線程1、2、3、4。線程1的功能就是輸出1,線程2的功能 ...
  • 創建類 實例化對象 form = 類名(instance=obj,data=request.POST) instance傳的是已有的對象(在頁面中顯示預設值)data傳的是從頁面返回過來的值(用戶輸入的值 ,用來驗證) form.is_valid() #驗證 form.save #將數據保存至資料庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...