二 Django入门

跟书《编程:从入门到实践》 , 学习用编写名为“学习笔记”的Web应用程序 。
Web应用程序的核心是让任何用户都能够注册账户并能够使用它 , 不管用户身处何方 。我们可以创建一些表单 , 让用户能够添加主题和条目 , 以及编辑既有的条目 。
让用户能够输入数据
先来添加几个页面 , 让用户能够输入数据 。可以让用户能够添加新主题、添加新条目以及编辑既有条目 , 但不能通过管理网站来输入 , 因为只有超级用户才可以这样做 。
添加新主题
首先来让用户能够添加新主题 。创建基于表单的页面的方法几乎与前面创建网页一样:定义一个URL , 编写一个视图函数并编写一个模板 。一个主要差别是 , 需要导入包含表单的模块forms.py 。
在中 , 创建表单的最简单方式是使用 。创建一个名为forms.py的文件 , 将其存储到.py所在的目录中 , 并在其中编写第一个表单 。
# vim learning_logs/forms.py
from django import formsfrom .models import Topicclass TopicForm(forms.ModelForm):class Meta:model = Topicfields = ['text']labels = {'text': ''}
首先导入了模块forms以及要使用的模型Topic 。然后定义了一个名为的类 , 它继承了forms. 。
最简单的版本只包含一个内嵌的Meta类 , 它告诉根据哪个模型创建表单 , 以及在表单中包含哪些字段 。我们根据模型Topic创建一个表单 , 该表单只包含字段text , 且让不要为字段text生成标签 。
# vim learning_logs/urls.py
"""定义learning_logs的URL模式"""from django.urls import path, re_pathfrom . import viewsapp_name='learning_logs'urlpatterns = [# 主页path('', views.index, name='index'),# 显示所有的主题path('topics/', views.topics, name='topics'),# 特定主题的详细页面re_path(r'^topics/(?P\d+)/$', views.topic, name='topic'),# 用于添加新主题的页面path('new_topic/', views.new_topic, name='new_topic'),]
这个URL模式会将请求交给视图函数() 。
函数()需要处理两种情形:刚进入网页 , 它应显示一个空表单;对提交的表单数据进行处理 , 并将用户重定向到网页 。
# vim learning_logs/views.py
from django.shortcuts import renderfrom django.http import HttpResponseRedirectfrom django.urls import reversefrom .models import Topicfrom .forms import TopicFormdef 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)