Django使用普通表單、Form、以及modelForm操作數據庫方式總結
阿新 • • 發佈:2018-05-23
信息 自定義字段 turn html 缺點 tin 顯示時間 流程 req
Django使用普通表單、Form、以及modelForm操作數據庫主要應用於增刪該查的情景下,流程通用如下,只是實現方式不一樣:
- 進入填寫表單頁面;
- 在表單頁面填寫信息,並提交;
- 表單數據驗證
- 驗證成功,和數據庫進行交互(增刪改查);
- 驗證成功,頁面提示表單填寫失敗;
一、Django使用普通表單操作數據庫
1、html代碼:
<form action="/add/" method="post" name="addbook">
{% csrf_token %} <p>
<p><span>用戶:</span><input type="text" placeholder="用戶" name="author"></p>
<p><span>用戶年齡:</span><input type="text" placeholder="用戶年齡" name="author_age"></p>
<input type="submit" value="增加">
</form>
2、點擊增加後,頁面判斷填寫字段是否合法(使用JavaScript或JQuery實現判斷)
前端校驗後,在/add/對應的view對數據進行校驗以及數據保存
from polls.models import Person #導入對應model
from django.http import HttpResponseRedirect
def addbooktodatabase(request):
# 獲取參數前端傳遞的參數
if request.method == "GET":
author_name = request.GET["author"]
author_age = request.GET["author_age"]
else:
author_name = request.POST["author"]
author_age = request.POST["author_age"]
#對前端參數按業務邏輯進行校驗
#代碼省略
## 保存數據到數據庫
person = Person()
person.name = author_name
person.age = author_age
person.save()
return HttpResponseRedirect(‘/addok/‘)
二、Django使用自有插件Form表單操作數據庫
和方法一的使用普通表單相比,使用django的Form表單更方便快捷地生成前端form表單以及對字段的校驗規則;
from django.shortcuts import render, HttpResponse, redirect
from django.forms import Form, fields, widgets
from model import * #導入對應的model
#Form驗證
class TestForm(Form):
inp1 = fields.CharField(min_length=4, max_length=8)
inp2 = fields.EmailField()
inp3 = fields.IntegerField(min_value=10, max_value=100)
View文件如下:
#測試函數
def test(request):
if request.method == ‘GET‘:
obj = TestForm()
return render(request, ‘test.html‘, {‘obj‘: obj})
else:
form = TestForm(request.POST)
if obj.is_valid():
#驗證合格,前端的數據保存在form.cleaned_data,model的create函數保存到數據庫
obj = models.Article.objects.create(**form.cleaned_data)
models.ArticleDetail.objects.create(content=content, article=obj)
return HttpResponse(‘提交成功‘)
html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/test/" method="post" novalidate>
{% csrf_token %}
<p>輸入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
<p>輸入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
<p>輸入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
<input type="submit" value="提交">
</form>
</body>
</html>
具體Form在前端展示以及校驗方式、以及操作model的方式(增刪改查)不展開,此處主要說明方式
三、Django使用插件modelForm表單操作數據庫
和方法二的使用表單Form相比,modelForm具有Form中所有的驗證鉤子,使用django的modelForm表單不需要重新定義Form,比較方便。
缺點是和數據庫model耦合性太強;
Model
class Article(models.Model):
title = models.CharField(max_length=20, unique=True)
author = models.ForeignKey(‘Author‘)
ModelForm
class ArticleForm(forms.ModelForm):
class Meta:
model = Article #對應的model
fields
=
"__all__"
#或(‘name‘,‘email‘,‘user_type‘) #驗證哪些字段,"__all__"表示所有字段
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
=
()
#本地化,根據settings中TIME_ZONE設置的不同時區顯示時間
def
clean_username(
self
):
value
=
self
.cleaned_data[
‘username‘
]
if
value
=
=
‘root‘
:
return
value
else
:
raise
ValidationError(
"你不是管理員!"
)
View文件如下:
def test(request):
if request.method == ‘GET‘:
obj =ArticleForm
()
return render(request, ‘test.html‘, {‘obj‘: obj})
else:
form =ArticleForm
(request.POST)
if obj.is_valid():
#驗證合格,前端的數據保存在到數據庫
form.save() #默認save(commit=True),默認保存多對多,當commit=False時可以拆分保存操作
return HttpResponse(‘提交成功‘)
html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/test/" method="post" novalidate>
{% csrf_token %}
<p>輸入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
<p>輸入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
<p>輸入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
<input type="submit" value="提交">
</form>
</body>
</html>
Django使用普通表單、Form、以及modelForm操作數據庫方式總結