1.使用基本的表单
首先,我们建立一个基本的文章投稿页面的模板
tougao.html
{% extends "base.html" %}/span>
{% block title %}文章投稿{% endblock %}
{% block content %}
<form action="/tougao/" method="post" name="tougaoform">
{% csrf_token %}
标题:<input type="text" name="title" size="36" />
<br />
内容:<textarea name="content" cols="55" rows="5"></textarea>
<br />
<input type="submit" value="投稿" />
</form>
{% endblock %}
注意 {% csrf_token %} 需要加入form模块中,否则views在接收post数据时会出现403错误。
其次,在views界面定义新的响应函数
views.py
def tougao(request):
if request.method == 'POST':
t = request.POST['title'] #获取post数据
c = request.POST['content']
txt = 'Title: ' + t + '; Content:' + c
return HttpResponse(txt)
elif request.method == 'GET':
return render(request, 'tougao.html') #包含{% csrf_token %},需要使用render,而render_to_response无效
else:
return HttpResponse('Wrong request!')
这里我们仅对投稿的数据进行显示。
从 t = request.POST['title'] 可以看出,表单项的值通过其name属性获得。
注意 包含{% csrf_token %}的模板,需要使用render,而render_to_response无效
修改urls.py,将网址指向响应函数
urlpatterns = [
#****
url(r'^tougao/',views.tougao),
]
运行结果如下:
投稿页面
点击投稿,提交信息后
2.使用form类型
(1)基本使用
上述方案中,我们直接在模板中提供了表格的代码。但是,这种方法也存在一定缺陷。
比如无法对用户输入的内容进行验证。还有就是提交后再回来已经输入的数据也会没了。
上述问题可以利用javascript在客户端进行判断。手动将输入之后的数据在 views 中都获取到再传递到网页,也是可行的,但是很不方便。
Django 提供了更简单易用的 forms 来解决验证等这一系列的问题。
我们在应用文件夹下新建一个 forms.py文件
from django import forms
from django.forms.widgets import Textarea
class ArticleForm(forms.Form):
title = forms.CharField()
content = forms.CharField(widget=Textarea)
我们的视图函数 views.py 中
from django.shortcuts import render
from django.shortcuts import HttpResponse
from home.models import Article
from .forms import ArticleForm
def index(request):
data = Article.objects.all()
return render(request, 'index.html', {'data':data})
def tougao(request):
if request.method == 'POST':
title = request.POST['title']
content = request.POST['content']
txt = 'Title: '+title+'; Content:'+content
return HttpResponse(txt)
elif request.method == 'GET':
form = ArticleForm() #生成表格类的实例
return render(request, 'tougao.html', {'form':form}) #传递表格类实例到模板中
else:
return HttpResponse('Wrong request!')
对应的模板文件tougao.html
{% extends "base.html" %}/span>
{% block title %}文章投稿{% endblock %}
{% block content %}
<form action="/tougao/" method="post" name="tougaoform">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="投稿" />
</form>
{% endblock %}
运行结果如下:
上述代码中,form.as_p,将表格展开为<p>标签。如果使用as_table,将展开为表格
{% extends "base.html" %}/span>
{% block title %}文章投稿{% endblock %}
{% block content %}
<form action="/tougao/" method="post" name="tougaoform">
{% csrf_token %}
<table>
{{form.as_table}}
</table>
<input type="submit" value="投稿" />
</form>
{% endblock %}
结果如下
如果使用as_ul,将展开为列表项
<form action="/tougao/" method="post" name="tougaoform">
{% csrf_token %}
<ul>
{{form.as_ul}}
</ul>
<input type="submit" value="投稿" />
</form>
注意 table 和ul标签要自己提供。
(2)定制标签
可以利用label参数对form的标签进行定制
from django import forms
from django.forms.widgets import Textarea
class ArticleForm(forms.Form):
title = forms.CharField(label='标题')
content = forms.CharField(label='内容', widget=Textarea)
3.表单和数据库结合
修改views.py,保存投稿数据到数据库
def tougao(request):
if request.method == 'POST':
t = request.POST['title']
c = request.POST['content']
a = Article(title=t, content=c)
a.save()
id = a.id
txt = 'New article saved:<br/>ID: '+str(id)+'<br/>Title: '+t+'<br/>Content:'+c
return HttpResponse(txt)
elif request.method == 'GET':
form = ArticleForm()
return render(request, 'tougao.html', {'form':form})
else:
return HttpResponse('Wrong request!')
运行结果如下:
投稿界面
返回信息
文章阅览界面已经有了新文章