Django中ModelForm組件的簡(jiǎn)單配置與使用教程
1、前言
hello大家好,今天學(xué)習(xí)了modelform組件,所以自己總結(jié)一下內(nèi)容,一來(lái),是怕自己忘記了,二來(lái),可以鞏固下今天的知識(shí),三來(lái),或許我寫的東西可以對(duì)一些初學(xué)Django的小伙伴帶來(lái)幫助呢,哈哈,廢話不多說(shuō),開(kāi)始進(jìn)入主題!
2、簡(jiǎn)單配置
創(chuàng)建好Django項(xiàng)目之后,首先到自己創(chuàng)建的app的models.py的文件下創(chuàng)建模型類,我就以一個(gè)添加學(xué)生的項(xiàng)目來(lái)介紹一下ModelForm,然后進(jìn)行數(shù)據(jù)庫(kù)遷移操作,兩條指令:python manage.py makemigrations 和 python manage.py migrate
from django.db import models # Create your models here. class Student(models.Model): name = models.CharField(max_length=6, verbose_name="學(xué)生姓名") age = models.IntegerField(max_length=3, verbose_name="學(xué)生年齡") birthday = models.DateField(verbose_name="學(xué)生生日") emil = models.EmailField(verbose_name="學(xué)生郵箱") create_time = models.DateField(auto_now_add=True, verbose_name="創(chuàng)建時(shí)間") class Meta: db_table = "db_student" def __str__(self): return self.name
隨后在自自己創(chuàng)建的app下面創(chuàng)建一個(gè)myforms.py文件(可以自己取名字,但是盡量避免重名),然后在文件中導(dǎo)入ModelForm,然后創(chuàng)建form類繼承ModelForm,選擇model,然后選擇需要做校驗(yàn)的字段,"__all__"就是全部校驗(yàn),也可以選出或排除需要校驗(yàn)的字段,如下:
from django.forms import ModelForm from django.forms import widgets from appo1.models import Student from django.core.exceptions import ValidationError class StudentModelForm(ModelForm): class Meta: model = Student fields = "__all__" # fields = ["name", "age"] # 只校驗(yàn)名字和年齡 # exclude = ["create_time"] # 除了建立時(shí)間其他的都要校驗(yàn) labels = {"name": "名字", "age": "年齡", "birthday": "生日", "emil": "郵箱"} widgets = { # 不同類型的字段要用不同的屬性輸出,不然表單的格式驗(yàn)證失效 # 給不同字段添加class屬性,改變樣式 "name": widgets.TextInput({"class": "form-control"}), "age": widgets.NumberInput({"class": "form-control"}), "birthday": widgets.DateInput({"class": "form-control", "type": "date"}), # 自己給type屬性讓前端模板有date樣式 "emil": widgets.EmailInput({"class": "form-control"}), } error_messages = {"emil": {"invalid": "請(qǐng)?zhí)顚懻_的郵箱格式"}} # 給錯(cuò)誤改中文
這樣下來(lái),基本配置也就做好了。(注意widgets設(shè)置的時(shí)候一定注意不同類型的字段要用不同的屬性)
3、創(chuàng)建模板文件,使用ModelForm組件
我們現(xiàn)在根目錄templates下創(chuàng)建html文件add_student.html,并且加上一個(gè)form標(biāo)簽,然后使用模板語(yǔ)法寫入后傳來(lái)的form數(shù)據(jù)。(順便使用一下bootstrap組件的效果)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" rel="external nofollow" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous"> </head> <style> form p span { color: red; font-size: 15px; margin: 5px; float: right; } </style> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1>添加學(xué)生1</h1> <form action="" method="post"> {% csrf_token %} <p class="form-group">姓名:{{ modelform.name }}<span>{{ modelform.name.errors.0 }}</span></p> <p>年齡:{{ modelform.age }}</p> <p>生日:{{ modelform.birthday }}</p> <p>郵箱:{{ modelform.emil }}</p> <p> </p> <p><input type="submit" class="btn btn-info" style="float: right"></p> </form> </div> </div> </div> </body> </html>
隨后在urls.py文件中添加路由
from django.contrib import admin from django.urls import path frpm app01.views import add_stu urlpatterns = [ path('admin/', admin.site.urls), path('add/', add_stu), ]
然后在視圖函數(shù)中定義函數(shù)add_stu(request)編寫邏輯代碼,這里我直接貼代碼了
from django.shortcuts import render, HttpResponse, redirect from appo1.my_model_form import StudentModelForm def add_stu(request): if request.method == "GET": modelform = StudentModelForm() return render(request, "add_student.html", {"modelform": modelform}) else: modelform = StudentModelForm(data=request.POST) if modelform.is_valid(): print(modelform.cleaned_data) return redirect("/") else: return render(request, "add_student.html", {"modelform": modelform})
這一通操作下來(lái),就可以把項(xiàng)目本地跑起來(lái)試試了,會(huì)的到以下頁(yè)面:
這樣ModelForm組件就運(yùn)用成功了!??!
補(bǔ)充:django中的modelform快速上手
modelform自定義添加字段
在上面的簡(jiǎn)單注冊(cè)form表單中,通常需要有給用戶輸入的確認(rèn)密碼的字段框,但是在用戶表中又不需要這個(gè)字段,modelform其實(shí)支持自定義添加molde中沒(méi)有的字段
# app01/forms.py from django import forms from app01 import models class RegisterModelForm(forms.ModelForm): # 自定義添加字段 confirm_password = forms.CharField(label='確認(rèn)密碼', widget=forms.PasswordInput) class Meta: model = models.UserInfo # 基于的model表名 fields = '__all__' # 表示自動(dòng)渲染所有字段
modelform 自定義顯示部分字段
- fields = '__all__' 表示自動(dòng)渲染所有字段
- fields = [’user‘,’password‘,’email‘] 表示僅渲染列表中的字段
- exclude = [’phone‘] 表示排除列表中的字段,效果同上
# app01/forms.py from django import forms from app01 import models class RegisterModelForm(forms.ModelForm): class Meta: model = models.UserInfo # 基于的model表名 fields = ['user‘,'password‘,'email‘] # 表示僅渲染列表中的字段 # exclude = ['phone‘] # 表示排除列表中的字段,效果同上
modelform 自定義錯(cuò)誤信息
modelform有自動(dòng)校驗(yàn)錯(cuò)誤并返回錯(cuò)誤信息的功能,如果不想用自帶的錯(cuò)誤信息的內(nèi)容,可以利用modelform中的error_messages 屬性進(jìn)行自定義
class RegisterModelForm(forms.ModelForm): class Meta: ... error_messages = { # 自定義錯(cuò)誤信息 'user':{ 'required': ('角色名稱不能為空'), }, '字段名':{ ‘錯(cuò)誤情況1':('錯(cuò)誤信息1‘), ... }, ... }
modelform 自定義參數(shù)(樣式)
比如想要讓password在輸入框中以密文形式顯示,則可以自定義參數(shù)
class RegisterModelForm(forms.ModelForm): # 自定義添加字段參數(shù)(方式一) confirm_password = forms.CharField(label='確認(rèn)密碼', widget=forms.PasswordInput) class Meta: ... widgets = { # 自定義標(biāo)簽參數(shù)(方式二) 'password': forms.PasswordInput(attrs={'class': 'form-control'}) }
后言
Form組件和ModelForm組件的區(qū)別:
- Form組件適合大型復(fù)雜網(wǎng)站的開(kāi)發(fā)使用。
- ModelForm犧牲了耦合性,讓模型類和form組件產(chǎn)生關(guān)系,適合小型網(wǎng)站開(kāi)發(fā)使用。
到此這篇關(guān)于Django中ModelForm組件的簡(jiǎn)單配置與使用教程的文章就介紹到這了,更多相關(guān)Django ModelForm組件使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用BeautifulSoup解析Html的方法示例
BeautifulSoup是python的一個(gè)庫(kù),最主要的功能是從網(wǎng)頁(yè)抓取數(shù)據(jù)。下面這篇文章主要給大家介紹了關(guān)于Python利用BeautifulSoup解析Html的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07基于python+opencv調(diào)用電腦攝像頭實(shí)現(xiàn)實(shí)時(shí)人臉眼睛以及微笑識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于python+opencv調(diào)用電腦攝像頭實(shí)現(xiàn)實(shí)時(shí)人臉眼睛以及微笑識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09- 我們知道python只定義了6種數(shù)據(jù)類型,字符串,整數(shù),浮點(diǎn)數(shù),列表,元組,字典。但是C語(yǔ)言中有些字節(jié)型的變量,在python中該如何實(shí)現(xiàn)呢?這點(diǎn)頗為重要,特別是要在網(wǎng)絡(luò)上進(jìn)行數(shù)據(jù)傳輸?shù)脑挕?/div> 2014-06-06
關(guān)于阿里云oss獲取sts憑證 app直傳 python的實(shí)例
今天小編就為大家分享一篇關(guān)于阿里云oss獲取sts憑證 app直傳 python的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法分析
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法,結(jié)合具體實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中構(gòu)造函數(shù)與析構(gòu)函數(shù)的概念、原理、功能及相關(guān)使用技巧,需要的朋友可以參考下2019-04-04最新評(píng)論