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


    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 HttpResponseRedirecdef 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('提交成功')



如果是修改,相應代碼改成:
obj = admin_obj.model.objects.get(id=obj_id)
if request.method == "GET":
obj_form = model_form(instance=obj)
elif request.method == "POST":
obj_form = model_form(instance=obj,data=request.POST)
if obj_form.is_valid():
obj_form.save()


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>


    
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM