昨日知识点回顾
创建主页、继承模版、显示特定主题页面
python
# 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
python
# learning_log\learning_logsforms.py
from django import forms
from .models import Topic
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
labels = {'text': ''}
2.URL模式new_topic
python
"""定义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
python
# 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
python
# 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
python
# 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 %}
19.1.2 添加新条目
1.用于添加新条目的表单
python
# forms.py
from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
labels = {'text': ''}
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text']
labels = {'text': ' '}
widgets = {'text': forms.Textarea(attrs={'cols': 80})}
2.URL模式new_entry
python
"""定义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()
python
# 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 = topic
new_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)
- 模版new_entry
python
# 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
python
# 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 %}