網(wǎng)站首頁 編程語言 正文
1、前言
hello大家好,今天學習了modelform組件,所以自己總結(jié)一下內(nèi)容,一來,是怕自己忘記了,二來,可以鞏固下今天的知識,三來,或許我寫的東西可以對一些初學Django的小伙伴帶來幫助呢,哈哈,廢話不多說,開始進入主題!
2、簡單配置
創(chuàng)建好Django項目之后,首先到自己創(chuàng)建的app的models.py的文件下創(chuàng)建模型類,我就以一個添加學生的項目來介紹一下ModelForm,然后進行數(shù)據(jù)庫遷移操作,兩條指令: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="學生姓名")
age = models.IntegerField(max_length=3, verbose_name="學生年齡")
birthday = models.DateField(verbose_name="學生生日")
emil = models.EmailField(verbose_name="學生郵箱")
create_time = models.DateField(auto_now_add=True, verbose_name="創(chuàng)建時間")
class Meta:
db_table = "db_student"
def __str__(self):
return self.name
隨后在自自己創(chuàng)建的app下面創(chuàng)建一個myforms.py文件(可以自己取名字,但是盡量避免重名),然后在文件中導入ModelForm,然后創(chuàng)建form類繼承ModelForm,選擇model,然后選擇需要做校驗的字段,"__all__"就是全部校驗,也可以選出或排除需要校驗的字段,如下:?
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"] # 只校驗名字和年齡
# exclude = ["create_time"] # 除了建立時間其他的都要校驗
labels = {"name": "名字", "age": "年齡", "birthday": "生日", "emil": "郵箱"}
widgets = {
# 不同類型的字段要用不同的屬性輸出,不然表單的格式驗證失效
# 給不同字段添加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": "請?zhí)顚懻_的郵箱格式"}} # 給錯誤改中文
這樣下來,基本配置也就做好了。(注意widgets設(shè)置的時候一定注意不同類型的字段要用不同的屬性)
3、創(chuàng)建模板文件,使用ModelForm組件
我們現(xiàn)在根目錄templates下創(chuàng)建html文件add_student.html,并且加上一個form標簽,然后使用模板語法寫入后傳來的form數(shù)據(jù)。(順便使用一下bootstrap組件的效果)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link
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>添加學生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})
這一通操作下來,就可以把項目本地跑起來試試了,會的到以下頁面:
這樣ModelForm組件就運用成功了?。?!?
補充:django中的modelform快速上手
modelform自定義添加字段
在上面的簡單注冊form表單中,通常需要有給用戶輸入的確認密碼的字段框,但是在用戶表中又不需要這個字段,modelform其實支持自定義添加molde中沒有的字段
# app01/forms.py
from django import forms
from app01 import models
class RegisterModelForm(forms.ModelForm):
# 自定義添加字段
confirm_password = forms.CharField(label='確認密碼', widget=forms.PasswordInput)
class Meta:
model = models.UserInfo # 基于的model表名
fields = '__all__' # 表示自動渲染所有字段
modelform 自定義顯示部分字段
- fields = '__all__' ? 表示自動渲染所有字段
- 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 自定義錯誤信息
modelform有自動校驗錯誤并返回錯誤信息的功能,如果不想用自帶的錯誤信息的內(nèi)容,可以利用modelform中的error_messages 屬性進行自定義
class RegisterModelForm(forms.ModelForm):
class Meta:
...
error_messages = { # 自定義錯誤信息
'user':{
'required': ('角色名稱不能為空'),
},
'字段名':{
‘錯誤情況1':('錯誤信息1‘),
...
},
...
}
modelform 自定義參數(shù)(樣式)
比如想要讓password在輸入框中以密文形式顯示,則可以自定義參數(shù)
class RegisterModelForm(forms.ModelForm):
# 自定義添加字段參數(shù)(方式一)
confirm_password = forms.CharField(label='確認密碼', widget=forms.PasswordInput)
class Meta:
...
widgets = { # 自定義標簽參數(shù)(方式二)
'password': forms.PasswordInput(attrs={'class': 'form-control'})
}
后言
Form組件和ModelForm組件的區(qū)別:
- Form組件適合大型復雜網(wǎng)站的開發(fā)使用。
- ModelForm犧牲了耦合性,讓模型類和form組件產(chǎn)生關(guān)系,適合小型網(wǎng)站開發(fā)使用。
原文鏈接:https://blog.csdn.net/weixin_60502877/article/details/124080930
相關(guān)推薦
- 2022-11-19 如何使用?Go?和?Excelize?構(gòu)建電子表格_Golang
- 2022-07-16 RabbitMQ 中 Connection 和 Channel 詳解
- 2022-08-10 Go?modules?replace解決Go依賴引用問題_Golang
- 2022-11-06 Go+Redis實現(xiàn)延遲隊列實操_Golang
- 2022-03-11 Golang如何讀取單行超長的文本詳解_Golang
- 2022-07-06 ?ASP.NET?Core?模型驗證過濾器的兩種實現(xiàn)方法_實用技巧
- 2022-12-10 jquery異常問題Uncaught?TypeError:?$(...).on?is?not?a?f
- 2023-03-27 React里的Fragment標簽的具體使用_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支