1. 程式人生 > >Django使用普通表單、Form、以及modelForm操作數據庫方式總結

Django使用普通表單、Form、以及modelForm操作數據庫方式總結

信息 自定義字段 turn html 缺點 tin 顯示時間 流程 req

Django使用普通表單、Form、以及modelForm操作數據庫主要應用於增刪該查的情景下,流程通用如下,只是實現方式不一樣:

  1. 進入填寫表單頁面;
  2. 在表單頁面填寫信息,並提交;
  3. 表單數據驗證
  4. 驗證成功,和數據庫進行交互(增刪改查);
  5. 驗證成功,頁面提示表單填寫失敗;

一、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操作數據庫方式總結