html的form表單
django中,前端如果要提交一些數據到views里面去,需要用到 html里面的form表單。
例如:
# form2/urls.py
from django.contrib import admin from django.urls import path,re_path from django.conf.urls import include from . import views urlpatterns = [ re_path(r'^home$', views.home), re_path(r'^login$', views.login), ]
# views.py
from django.shortcuts import render,HttpResponse def login(request): return render(request, 'form2/login.html')
# login.html
<form action="/form2/home" method="post"> #向這個頁面發送post請求,action配置目標地址
<p>用戶名:<input type="text" name="username"></p> #name表示key,value等於input輸入的內容
<input type="submit" value="提交">
</form>
第二種方法: 使用url_name
login.html <form action="{% url 'homepage' %}" method="post">
urlpatterns = [
re_path(r'^home$', views.home,name='homepage'), #url命名
re_path(r'^login$', views.login),
]
<form action="{% url 'app_form2:homepage' %}" method="post">
path('form2/', include('form2.urls',namespace='aaaa')), #namespace必須有值,值好像可隨便取~
app.urls
app_name = 'app_form2' #django2.0之后必須寫此項,否則會報錯
urlpatterns = [
re_path(r'^home$', views.home, name='homepage'), #url_name
# form2/views.py
from django.shortcuts import render,HttpResponse def login(request): return render(request, 'form2/login.html') def home(request): username = request.POST.get('username') or 'lily' #前端form表單傳過來的username數據,如果為空則默認為'lily' return render(request, 'form2/homepage.html', {"username":username}) #將username傳給homepage.html
# homepage.html
<body> welcome, {{username}}! # views傳過來的username變量 </body>
訪問 http://127.0.0.1:8000/form2/login
提交之后,login頁面會跳轉到/form2/home頁面
Django的form表單
主要作用是1,生成html標簽,2,表單驗證。
# 新建forms.py ,定義表單字段類型
from django import forms class Person_Info(forms.Form): name = forms.CharField(max_length=4) # 字符串類型,最長不超過4個字符 birthday = forms.DateField() #日期類型 email = forms.EmailField(required=False) # required=False表示可以為空,默認是True,不能為空 phone = forms.IntegerField() #數值類型
# views.py
from django.shortcuts import render,HttpResponse from .forms import Person_Info #導入form表單 def person(request): person_obj = Person_Info() # 創建了這個對象 return render(request,'form2/info.html',{'obj':person_obj}) #然后把對象傳給html
info.html
<form action="" method="post"> {% csrf_token %} # django自帶的csrf驗證,不加提交時會報錯 {{ obj }} # views傳的對象, 可以自動創建html標簽 <div>姓名:{{ obj.name }}</div> # 也可以單獨取對象中的某一個字段 <!--<div>生日:{{ obj.birthday }}</div>--> <!--<div>郵箱:{{ obj.email }}</div>--> <!--<div>手機號:{{ obj.phone}}</div>--> <input type="submit" value="提交"> </form>
csrf_token如果不加上,提交表單會報錯
或者在settings里面注釋掉'django.middleware.csrf.CsrfViewMiddleware', 這行也可以。
訪問 http://127.0.0.1:8000/form2/info可以看到生成的表單。體現了django的form的第一個作用,即自動生成html標簽,如下:
填入數據的時候,如果數據不合法,就會有提示。
這樣在后端就可以驗證,如果字段合法,就獲取數據操作,如果不合法,就返回錯誤信息。
驗證用戶輸入
views.py
from django.shortcuts import render from .forms import Person_Info def person(request): form_obj = Person_Info() if request.method == 'POST': #獲取用戶輸入 print("request.POST:", request.POST) form_obj = Person_Info(request.POST) #將post過來的數據當做參數傳給Person_Info這個form表單,將name,birthday,email等封裝到form_obj,判斷輸入是否合法 print("form is valid:", form_obj.is_valid()) # 通過is_valid()方法判斷表單數據是否合法 return render(request, 'form2/info.html', {"obj": form_obj})
這里我輸入一個不合法的birthday,可以看到:
增加一個判斷,如果填寫的表單正確,返回表單數據,如果不合法,返回錯誤信息。
from django.shortcuts import render,HttpResponse from .forms import Person_Info def person(request): form_obj = Person_Info() if request.method == 'POST': form_obj = Person_Info(request.POST) if form_obj.is_valid(): print("form is valid ^_^** ", form_obj.cleaned_data) # 返回表單數據,是字典形式 username = form_obj.cleaned_data.get('name') #取出填寫的name的值 if username == 'lily': return HttpResponse('*lily*') else: errors = form_obj.errors print("form is invalid T_T... ", errors) # .errors 獲取錯誤信息 return render(request, 'form2/info.html', {'obj': form_obj, 'errors': form_obj.errors }) return render(request, 'form2/info.html', {'obj': form_obj})
info.html
<form action="/form2/info" method="post"> {% csrf_token %} {% for i in obj %} <div>{{ i.name }} {{ i }} {{ i.errors }} </div> # i.name獲取每個字段的名字,i.errors獲取錯誤信息 {% endfor %} <input type="submit" value="提交"> </form>
測試,輸入一個非法的:
輸入一個正確的:
ModelForm
因為models和form都能定義數據類型,如果想要數據庫里的數據展示在前端,那么可以使用modelform,省去form定義字段類型。
例如:我已有了Article數據表。想要創建一個允許人們寫文章的表單

from django.db import models class Article(models.Model): title = models.CharField(max_length=32,default='Title') content = models.TextField(null=True) def __str__(self): return self.title
# forms.py
from django import forms from django.forms import ModelForm from myblog import models # 導入myblog.models數據表 class Article_Model_Form(forms.ModelForm): #繼承ModelForm類 class Meta: model = models.Article #導入數據表 fields = ['title', 'content'] #要使用的字段
exclude = () #排除字段
# views.py
from .forms import Article_Model_Form def article_modelform(request): form = Article_Model_Form() #創建一個表單來添加一條數據 if request.method == 'POST': form = Article_Model_Form(request.POST) if form.is_valid(): # 判斷表單是否合法 print("form is ok", form.cleaned_data) form.save() # 將合法的數據保存到數據表中 else: error_msg = form.errors return render(request, 'form2/article.html', {"article_form": form ,"errors": error_msg}) return render(request, 'form2/article.html', {"article_form": form})
# article.html
<form action="" method="post"> {{ article_form }} <input type="submit" value="提交"> </form>
在表單填入
可以從后台看到,數據創建成功。