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’後解決。

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