接著上節繼續學習,本章將建立用戶賬戶
Web應用程序的核心是讓任何用戶都能夠注冊賬戶并能夠使用它,不管用戶身處何方。在本章中,你將創建一些表單,讓用戶能夠添加主題和條目,以及編輯既有的條目。你還將學習Django如何防范對基于表單的網頁發起的常見攻擊,這讓你無需花太多時間考慮確保應用程序安全的問題。
一 讓用戶能夠輸入數據
建立用于創建用戶賬戶的身份驗證系統之前,我們先來添加幾個頁面,讓用戶能夠輸入數據。我們將讓用戶能夠添加新主題、添加新條目以及編輯既有條目。
1.1 用于添加主題的表單
讓用戶輸入并提交信息的頁面都是表單,那怕它看起來不像表單。用戶輸入信息時,我們需要進行驗證,確認提供的信息是正確的數據類型,且不是惡意的信息,如中斷服務器的代碼。然后,我們再對這些有效信息進行處理,并將其保存到數據庫的合適地方。這些工作很多都是由Django自動完成的。
在Django中,創建表單的最簡單方式是使用ModelForm,它根據前面的模型中的信息自動創建表單。創建一個名為forms.py的文件,將其存儲到models.py所在的目錄中,并在其中編寫你的第一個表單:
from django import formsfrom .models import Topicclass TopicForm(forms.ModelForm):class Meta:model = Topicfields=['text']labels={'text':''}
1.2URL模式new_topic
#定義learning_logs的URL模式from django.conf.urls import urlfrom . import viewsapp_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 renderfrom django.http import HttpResponseRedirect
from django.urls import reverse_lazyfrom .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 編輯條目
過程和上面的差不多,這里就不在詳細說了,效果如下:
小結:至此,“學習筆記”已具備了需要的大部分功能。用戶可添加主題和條目,還可根據需要查看任何一組條目。在下一節,我們將實現一個用戶注冊系統,讓任何人都可向“學習筆記”申請賬戶,并創建自己的主題和條目。
?未完待續
?