接着上節繼續學習,本章將建立用戶賬戶
Web應用程序的核心是讓任何用戶都能夠注冊賬戶並能夠使用它,不管用戶身處何方。在本章中,你將創建一些表單,讓用戶能夠添加主題和條目,以及編輯既有的條目。你還將學習Django如何防范對基於表單的網頁發起的常見攻擊,這讓你無需花太多時間考慮確保應用程序安全的問題。
一 讓用戶能夠輸入數據
建立用於創建用戶賬戶的身份驗證系統之前,我們先來添加幾個頁面,讓用戶能夠輸入數據。我們將讓用戶能夠添加新主題、添加新條目以及編輯既有條目。
1.1 用於添加主題的表單
讓用戶輸入並提交信息的頁面都是表單,那怕它看起來不像表單。用戶輸入信息時,我們需要進行驗證,確認提供的信息是正確的數據類型,且不是惡意的信息,如中斷服務器的代碼。然后,我們再對這些有效信息進行處理,並將其保存到數據庫的合適地方。這些工作很多都是由Django自動完成的。
在Django中,創建表單的最簡單方式是使用ModelForm,它根據前面的模型中的信息自動創建表單。創建一個名為forms.py的文件,將其存儲到models.py所在的目錄中,並在其中編寫你的第一個表單:
from django import forms
from .models import Topic
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields=['text']
labels={'text':''}
1.2URL模式new_topic
#定義learning_logs的URL模式
from django.conf.urls import url
from . import views
app_name='learning_logs'
urlpatterns=[
#主頁
url(r'^$',views.index,name='index'),
#顯示所有主題,
url(r'^topics/$',views.topics,name='topics'),
#特定主題的詳細頁面
url(r'^topics/(?P<topic_id>\d+)',views.topic,name='topic'),
#用於添加新主題的網頁
url(r'^new_topic/$',views.new_topic,name='new_topic'),
]
1.3 視圖函數new_topic()
函數new_topic()需要處理兩種情形:剛進入new_topic網頁(在這種情況下,它應顯示一個空表單);對提交的表單數據進行處理,並將用戶重定向到網頁topics:
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from .forms import TopicForm
from .models import Topic
# Create your views here.
def index(request):
'''學習筆記的主頁'''
return render(request,'learning_logs/index.html')
def topics(request):
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
def topic(request,topic_id):
'''顯示單個主題以及所有的條目'''
topic=Topic.objects.get(id=topic_id)
entries=topic.entry_set.order_by('-date_added')
context = {'topic':topic,'entries':entries}
return render(request, 'learning_logs/topic.html', context)
def new_topic(request):
'''添加新主題'''
if request.method !='POST':
#未提交數據:創建一個新表單
form = TopicForm()
else :
#POST提交的數據,對數據進行處理
form = TopicForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form':form}
return render(request,'learning_logs/new_topic.html',context)
1.4 模板new_topic
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Add a new topic:</p>
<form action="{% url 'learning_logs:new_topic' %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit">add topic</button>
</form>
{% endblock content %}
1.5 鏈接到頁面new_topic
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
<a href="{% url 'learning_logs:new_topic' %}">Add a new topic:</a>
{% endblock content %}
最后的結果如下圖:

2 添加新條目
現在用戶可以添加新主題了,但他們還想添加新條目。我們將再次定義URL,編寫視圖函數和模板,並鏈接到添加新條目的網頁。效果如下圖:

3 編輯條目
過程和上面的差不多,這里就不在詳細說了,效果如下:

小結:至此,“學習筆記”已具備了需要的大部分功能。用戶可添加主題和條目,還可根據需要查看任何一組條目。在下一節,我們將實現一個用戶注冊系統,讓任何人都可向“學習筆記”申請賬戶,並創建自己的主題和條目。
未完待續
