Python 項目實踐三(Web應用程序)第四篇


接着上節繼續學習,本章將建立用戶賬戶

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 編輯條目

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

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

 未完待續

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM