目录
7 处理用户输入
接着上一篇文章的内容,应用建成之后,如何来处理用户输入的内容?
7.1 在模板添加HTML表单
在此为用户创建一个表单,修改myblog/templates/archive.html文件:
<form action="/myblog/create/" method="post">{% csrf_token %}
<table>{
{ form }}</table><br>
Title:
<input type= text name=title><br>
Body:
<textarea name=body rows=3 clos=60></textarea><br>
<input type=submit>
</form>
<hr>
{% for post in posts %}
<h2>{
{ post.title }}</h2>
<p>{
{ post.tiemstamp }}</p>
<p>{
{ post.body }}</p>
<hr>
{% endfor %}
启动服务器,刷新浏览器页面,同时显示了用户的输入和博文:
7.2 向应用添加URLconf项
使用上一步的html,需要用到/myblog/create/路径,创建视图函数creat_blogpost,用于把内容保存到数据库。
在/myblog/urls.py添加项:
from django.urls import re_path as url
from . import views
urlpatterns = [
url(r'^archive$',views.archive),
url(r'^create/',views.create_blogpost),
]
7.3 创建视图
修改/myblog/views.py文件,添加上一步用到的函数creat_blogpost:
from django.shortcuts import render
from myblog.models import BlogPost
from django.http import HttpResponseRedirect
from datetime import datetime
from django.template import RequestContext
# Create your views here.
def archive(request):
#post = BlogPost.objects.all()
post = BlogPost.objects.all().order_by('-timestamp')
return render(request,'archive.html',{'posts':post})
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('/myblog/archive')
此时填写表单内容,点击提交,已经可以实现添加。
8 建立表单和表单模型
为了简化接受用户数据,做如下修改
1.在myblog/models.py中添加BlogPostForm类:
from django.db import models
from django import forms
# Create your models here.
class BlogPost(models.Model):
title = models.CharField(max_length=150) #博客的标题
body = models.TextField() #博客正文
timestamp = models.DateTimeField() #博客创建时间
class Meta:
ordering = ('-timestamp',)
class BlogPostForm(forms.ModelForm):
class Meta:
model = BlogPost #Meta类表示这个表单基于哪个模型
exclude = ('timestamp',) #从HTML移除这个表单项
2.使用ModelForm生成HTML
修改myblog/templates/archive.html:
<form action="/myblog/create/" method="post">{% csrf_token %}
<table> {
{ form }}</table>
<input type= text name=title><br>
</form>
<hr>
{% for post in posts %}
<h2>{
{ post.title }}</h2>
<p>{
{ post.tiemstamp }}</p>
<p>{
{ post.body }}</p>
<hr>
{% endfor %}
3.修改myblog/views.py:实现更新视图函数,实例化ModelForm并进行传递。
from django.shortcuts import render
from myblog.models import BlogPost,BlogPostForm
from django import forms
from django.http import HttpResponseRedirect
from datetime import datetime
from django.template import RequestContext
# Create your views here.
def archive(request):
#post = BlogPost.objects.all()
post = BlogPost.objects.all().order_by('-timestamp')
# return render(request,'archive.html',{'posts':post})
return render(request,'archive.html',{'posts':post,'form':BlogPostForm()})
def create_blogpost(request):
if request.method == 'POST':
form = BlogPostForm(request.POST)
if form.is_valid():
post = form.save(commit=False) #保存表单,但没有保存模型
post.timestamp=datetime.now()
post.save() #保存模型
return HttpResponseRedirect('/myblog/archive')
刷新浏览器,已实现: