Python核心编程笔记————Web框架:Django(二)

创建博客的界面

. 从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’后解决。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章