Django之Modelform組件

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

Modelform組件 Modelform就是model和from兩者結合起來的。它既有驗證,又有資料庫的操作 Modelform組件: Modelform註意事項: 1、類 示列(增刪改查): url: from django.conf.urls import url from django.co ...


Modelform組件

Modelform就是model和from兩者結合起來的。它既有驗證,又有資料庫的操作

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註意事項:

1、類

  class Foo(ModelFrom):
       class Meta:
model=models.Role
#fields="__all__" 所有的欄位 #fields=['caption',] 只取caption這個欄位
#xclude=['caption'] 除caption這個欄位外不取,剩餘的都取
error_massages={
'title':{'required':'名稱不能為空','invalid':'格式錯誤'}
}
widgets={
'title':wd.TextInput(attrs={'class':'c1'})
}
2.添加:
GET:
form=Foo()
POST:
form=Foo(instaance=obj,data=request.POST)
form.save()

示列(增刪改查):

url:

 

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^role/$', views.role),
    url(r'^role/add/$', views.role_add),
    url(r'^role/edit/(\d+)/$', views.role_edit),
    url(r'^usertype/$', views.user_type),
    url(r'^usertype/add/$', views.user_type_add),
    url(r'^usertype/edit/(\d+)/$', views.user_type_edit),
    #url(r'^role.html$', admin.site.urls),
]
url

 

views:

from django.shortcuts import render,redirect,HttpResponse
from app01 import models


from django.forms import Form,ModelForm
from django.forms import fields
from django.forms import widgets as wd




def role(request):
    roles = models.Role.objects.all()
    return render(request,'role.html',{'roles':roles})


class Role(ModelForm):

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


def role_add(request):
    if request.method == "GET":
        form = Role()
        return render(request,'role_add.html',{'form':form})
    else:
        form = Role(request.POST)
        if form.is_valid():
            form.save()
            # models.Role.objects.create(**form.cleaned_data)
            # models.Role.objects.create(**{'catpion':'123'})
            return redirect('/role/')
        else:
            return render(request, 'role_add.html', {'form': form})


def role_edit(request,nid):
    obj = models.Role.objects.filter(id=nid).first()
    if not obj:
        return HttpResponse('數據不存在')

    if request.method == "GET":
        form = Role(instance=obj)
        return render(request,'role_edit.html',{'form':form})
    else:
        form = Role(data=request.POST,instance=obj)
        if form.is_valid():
            form.save()
            return redirect('/role/')
        else:
            return render(request, 'role_edit.html', {'form': form})


def user_type(request):
    user_type_list = models.UserType.objects.all()
    return render(request,'user_type.html',{'user_type_list':user_type_list})

class UserTypeModeForm(ModelForm):
    title = fields.CharField(max_length=6,required=True,widget=wd.Textarea())

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

        error_messages = {
            'title':{'required':'名稱不能為空','invalid':'格式錯誤'}
        }
        widgets = {
            'title':wd.TextInput(attrs={'class':'c1'})
        }

    # 鉤子函數

def user_type_add(request):
    if request.method == "GET":
        form = UserTypeModeForm()
        return render(request,'user_type_add.html',{'form':form})
    else:
        form = UserTypeModeForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/usertype/')
        else:
            return render(request, 'user_type_add.html', {'form': form})


def user_type_edit(request,nid):
    obj = models.UserType.objects.filter(id=nid).first()
    if not obj:
        return HttpResponse('...')

    if request.method == 'GET':
        # 顯示預設值
        form = UserTypeModeForm(instance=obj)
        return render(request,'user_type_edit.html',{'form':form})
    else:
        form = UserTypeModeForm(instance=obj,data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('/usertype/')
        else:
            return render(request, 'user_type_edit.html', {'form': form})
Views

role.html:

</head>
<body>
    <ul>
        {% for row in roles %}
            <li>{{ row.caption }}</li>
        {% endfor %}
    </ul>
</body>
</html>
role.html

role_add.html:

<body>
    <form method="post">
        {% csrf_token %}
        <p>{{ form.caption }} {{ form.errors.caption.0 }}</p>
        <input type="submit" value="提交">
    </form>
</body>
role_add

role_edit.html:

<body>
    <form method="post">
        {% csrf_token %}
        <p>{{ form.caption }} {{ form.errors.caption.0 }}</p>
        <input type="submit" value="提交">
    </form>
</body>
role_edit.html

user_type.html

<body>
    <ul>
        {% for row in user_type_list %}
            <li>{{ row.title }} - {{ row.roles.all }}</li>
        {% endfor %}
    </ul>
</body>
user_type.html

user_type_add.html

<body>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="提交">
    </form>
</body>
user_type_add.html

user_type_edit.html

<body>
    <form method="post" novalidate>
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="提交">
    </form>
</body>
user_type_edit.html

 

 

 

 

    


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

-Advertisement-
Play Games
更多相關文章
  • 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 #將數據保存至資料庫 ...
  • 一、ModelForm的介紹 應用場景: - ModelForm - 中小型應用程式。因為ModelForm是依賴於models的 - Form - 大型應用程式 * 註意事項: 二、表結構 三、基於Form組件的添加和編輯 添加:這隻是單表的添加 編輯:單表的編輯 具體基於Form組件實現的一對多 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...