二 Django入门( 三 )


除了导入Topic外 , 还需要导入Entry 。新类继承了forms. , 它包含的Meta类指出了表单基于的模型以及要在表单中包含哪些字段 。
后面定义了属性 , 小部件()是一个HTML表单元素 , 如单行文本框、多行文本区域或下拉列表 。通过设置属性 , 可覆盖选择的默认小部件 。通过让使用forms. , 我们定制了字段'text'的输入小部件 , 将文本区域的宽度设置为80列 , 而不是默认的40列 。
在用于添加新条目的页面的URL模式中 , 需要包含实参  , 因为条目必须与特定的主题相关联 。
# 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'),# 用于添加新条目的页面re_path(r'^new_entry/(?P\d+)/$', views.new_entry, name='new_entry'),]
这个URL模式与形式为:8000//id/的URL匹配 , 其中id是一个与主题ID匹配的数字 。代码(?P\d+)捕获一个数字值 , 并将其存储在变量中 。请求的URL与这个模式匹配时 , 将请求和主题ID发送给函数() 。
视图函数()与视图函数()比较类似 。
# vim learning_logs/views.py
from django.shortcuts import renderfrom django.http import HttpResponseRedirectfrom django.urls import reversefrom .models import Topicfrom .forms import TopicForm, EntryFormdef 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)def new_entry(request, topic_id):"""在特定的主题中添加新条目"""topic = Topic.objects.get(id=topic_id)if request.method != 'POST':# 未提交数据 , 创建一个空表单form = EntryForm()else:# POST提交的数据 , 对数据进行处理form = EntryForm(data=http://www.kingceram.com/post/request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic_id]))context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)
首先导入了刚创建的 , ()的定义包含形参 , 用于存储从URL中获得的值 。渲染页面以及处理表单数据时 , 都需要知道针对的是哪个主题 , 因此我们使用来获得正确的主题 。