创建博客的界面
. 从Django的角度来看,web界面应该有以下几个经典的组件:
. 1.一个模板:用于显示通过 Python 类字典对象传入的信息。
. 2.一个视图函数:用于执行针对请求的核心逻辑。
. 3.一个 URL 模式:将传入的请求映射到对应的视图中,同时也可以将参数传递给视图。
创建模板
. Django的模板语言比较简单,一个简单的模板与下面类似:
<!-- archive.html -->
{% for post in posts %}
<h2>{{ post.title|title }}</h2>
<p>{{ post.timestamp }}</p>
<p>{{ post.body }}</p>
<hr>
{% endfor %}
. 看得出来这是一个Html文件和一些花括号组成的语句,模板语言中变量标签通过一对花括号分割,而块标签通过花括号和百分号来表示,用来向模板中插入循环或是判断这样的逻辑。
. 接下来在views.py中添加函数来使用模板:
#没使用模板的简单视图
def detail(request,q_id):
return HttpResponse("You're looking at question %s." % q_id)
#使用模板
def index(request):
posts = BlogPost.objects.order_by('id')
#template = loader.get_template('archive.html')
context = {
'posts' : posts
}
#return HttpResponse(template.render(context,request))
return render(request,'archive.html',context)
. 最后在urls.py中添加相关的路径:
urlpatterns = [
path('admin/', admin.site.urls),
。。。
path('index/',views.index,name = 'index')
]
. 之后就能通过http://127.0.0.1:8000/index/访问自己创建的页面了。
处理用户输入
. 接下来是一个通过用户输入来创建博文的例子,主要分为三步:
1.添加一个HTML表单,让用户可以输入;
2.插入这样的URLconf项;
3.创建视图处理用户输入。
添加HTML表单
. 创建带输入的HTML文件,添加到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>
<hr>
. 其中的{% csrf_token %}用于跨站点请求伪造,并且还需要将settings.py中的’django.middleware.csrf.CsrfViewMiddleware’这一句注释掉,这样在点击提交按钮的时候就不会报403错误了。
添加URLconf项
. 下一步是添加URLconf项,将这个函数命名为create_blogpost:
urlpatterns = [
...,
path('blog/create/',views.create_blogpost,name = 'create_blogpost')
]
添加视图函数
. 添加用于处理用户输入的视图函数:
from datetime import datetime
from django.http import HttpResponse,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/index')
#并将index函数中的返回改为
def index(request):
...
return render(request,'archive.html',{'posts':posts})
. 之后在页面输入信息并提交后的内容会显示在网页下方。
表单和模型表单
Django表单简介
. 为了简化开发流程,避免重复输入表单样式,使用模板表单可以自动生成HTNL代码替换原来的HTML代码,比如:
from django import forms
class BlogPostForm(forms.ModelForm):
class Meta:
model = BlogPost
exclude = ('timestamp',)
. 使用exclude是为了让时间戳不从用户输入获得,接下来可以讲html中的代码修改成:
<form action="/blog/create/" method="post">{% csrf_token %}
<table>{{ form }}</table>
<input type="submit">
</form>
<hr>
. 还要记得在函数中对form进行键值对的传值,将index函数中的返回值部分修改一下:
return render_to_response('archive.html',{'posts':posts,'form':BlogPostForm()},RequestContext(request))
处理ModelForm数据
. 创建的部分简化了,获取数据的部分自然也可以简化:
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('/blog/index')
. 使用模板的时候,出现了中文乱码的情况,在settings.py中加入DEFAULT_CHARSET = 'GB18030’后解决。