# 昨日知识点回顾
创建主页、继承模版、显示特定主题页面
# view.py
from django.shortcuts import render# 导入所需数据相关联的模型
from .models import Topic# Create your views here.
def index(request):"""学习笔记的主页"""# 传递两个实参:对象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):"""显示单个主题"及所有的条目"""# get()获得制定主题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)
修改后浏览器输入网址localhost:8000/topics/2/显示:
# 今日知识点学习
第19章 用户账号
19.1 让用户输入数据
使用Django表单创建工具创建让用户能够输入数据的页面
19.1.1 添加新主题
1.用于添加主题的表单
在Django中,创建表单最简单的方式是使用ModelForm
# learning_log\learning_logsforms.py
from django import formsfrom .models import Topicclass TopicForm(forms.ModelForm):class Meta:model = Topicfields = ['text']labels = {'text': ''}
2.URL模式new_topic
"""定义learining——logs的URL模式。"""
# 为映射视图,导入path
from django.urls import path
# 从当前文件夹引入view.py
from . import views
# app_name 区分同项目同名文件
app_name = 'learning_logs'# urlpatterns包含learning_logs中请求的页面
urlpatterns = [# 主页path('', views.index, name='index'),# 第一个帮助Django正确路由请求,空字符串与基础URL匹配,第二个实参指定调用函数,第三个指定URL模式名称指定为index# 显示所有的主题path('topics/', views.topics, name='topics'),# 特定主题的详细页面path('topics/<int:topic_id>/', views.topic, name='topic'),# 用于添加新主题的页面path('new_topic/', views.new_topic, name='new_topic')
]
3.视图函数new_topic()
处理两种情形:①刚进入new_topic页面显示空表单,②对提交的表单进行处理,将用户重定向回topics
# view.py
from django.shortcuts import render# 导入所需数据相关联的模型
from .models import Topic
from .forms import TopicForm# Create your views here.
def index(request):"""学习笔记的主页"""# 传递两个实参:对象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(data=request.POST)if form.is_valid():form.save()return redirect('learning_logs:topics')# 显示空表单后指出表单数据无效context = {'form': form}return render(request, 'learning_logs/new_topic.html', context)
4.GET请求和POST请求
创建Web应有程序时,用到的两个主要请求类型GET请求和POST请求。
对于只是从服务器读取数据的页面,使用GET请求
在用户需要通过表单提交信息时,通常使用POST请求
5.模版new_topic
# new_topic.html
{% 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 %}
6.链接到页面new_topic
# topics.html
{% 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 %}
localhost:8000/new_topic/显示:
19.1.2 添加新条目
1.用于添加新条目的表单
# forms.py
from django import formsfrom .models import Topic, Entryclass TopicForm(forms.ModelForm):class Meta:model = Topicfields = ['text']labels = {'text': ''}class EntryForm(forms.ModelForm):class Meta:model = Entryfields = ['text']labels = {'text': ' '}widgets = {'text': forms.Textarea(attrs={'cols': 80})}
2.URL模式new_entry
"""定义learining——logs的URL模式。"""
# 为映射视图,导入path
from django.urls import path
# 从当前文件夹引入view.py
from . import views
# app_name 区分同项目同名文件
app_name = 'learning_logs'# urlpatterns包含learning_logs中请求的页面
urlpatterns = [# 主页path('', views.index, name='index'),# 第一个帮助Django正确路由请求,空字符串与基础URL匹配,第二个实参指定调用函数,第三个指定URL模式名称指定为index# 显示所有的主题path('topics/', views.topics, name='topics'),# 特定主题的详细页面path('topics/<int:topic_id>/', views.topic, name='topic'),# 用于添加新主题的页面path('new_topic/', views.new_topic, name='new_topic'),# 用于添加新条目的页面path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry')
]
3.视图函数new_entry()
# view.py
from django.shortcuts import render, redirect# 导入所需数据相关联的模型
from .models import Topic
from .forms import TopicForm, EntryForm# Create your views here.
def index(request):"""学习笔记的主页"""# 传递两个实参:对象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(data=request.POST)if form.is_valid():form.save()return redirect('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=request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return redirect('learning_logs:topic', topic_id=topic_id)# 显示空表单或支出表单数据无效context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)
4. 模版new_entry
# new_entry.html
{% extends "learning_logs/base.html" %}{% block content %}<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p><p>Add a new entry:</p><form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'>{% csrf_token %}{{ form.as_p }}<button name="submit">Add entry</button> </form>{% endblock content %}
5.链接到页面new_entry
# topic.html
{% extends 'learning_logs/base.html' %}{% block content %}<p>Topic: {{ topic }}</p><p>Entries:</p><p><a href="{% url 'learning_logs:new_entry' topic.id %}">Add new entry</a></p><ul>{% for entry in entries %}<li><p>{{ entry.date_added|date:'M d, Y H:i' }}</p><p>{{ entry.text|linebreaks }}</p></li>{% empty %}<li>There are no entries for this topic yet.</li>{% endfor %}</ul>{% endblock content %}
localhost:8000/new_entry/3/运行显示: