增加用户输入流程
- 添加一个HTML表单
- 插入(URL,视图)这样的URLconf项
- 创建视图来处理用户输入
添加HTML表单
blog\templates\archive.html
<form action="/blog/create/" method="post"> {% csrf_token %}
Title:
<input type=text name=title><br>
Body:
<textarea name=body rows=3 cols=60></textarea><br>
<input type=submit>
</form>
开发时,将输入放在显示页面,只是为了调试方便。
POST方法需要添加{% csrf_token %}
添加URLconf
blog\urls.py
urlpatterns = [
url(r'^$', archive),
url(r'^create/', create_blogpost),#新增
]
视图添加处理
blog\views.py
from django.http import HttpResponseRedirect
def create_blogpost(request):
if request.method == 'POST':
BlogPost(
title=request.POST.get('title'),
body=request.POST.get('body'),
timestamp=datetime.now()
).save()
return HttpResponseRedirect('/blog/')
测试
- 访问http://127.0.0.1:8000/blog/
- 输入信息
- 点击“Submit”
- 可以在网页看到新增blog
过程:
页面输入=>Submit=>“/blog/create/”Action =>Urlconf=>create_blogpost()=>BlogPost.save()=>重定向到/blog/=>页面显示
使用Django表单优化
- 修改模型
blog\models.py, 新增BlogPostForm类
class BlogPostForm(forms.Form):
title=forms.CharField(max_length=150)
body=forms.CharField(widget=forms.Textarea(attrs={'rows':3, 'cols':60})
timestamp=forms.DateTimeField()
当字段和数据模型完全一致时,可以使用ModelForm,通过Meta.model指定数据模型,exclude指定要从HTML表单中移除的字段。
class BlogPostForm(forms.ModelForm):
class Meta:
model = BlogPost
exclude = ('timestamp',)
- 修改HTML
blog\templates\archive.html
<form action="/blog/create/" method="post"> {% csrf_token %}
<table>{{ form }}</table><br>
<input type=submit>
</form>
- 修改视图
blog\views.py
def create_blogpost(request):
if request.method == 'POST':
form = BlogPostForm(request.POST)
if form.is_valid():
post = form.save(commit=False) #此处为表单的save(),因为commit=False,在post.save()前不会保存数据
post.timestamp = datetime.now()
post.save()
return HttpResponseRedirect('/blog/')