《python编程从入门到实践》day39

昨日知识点回顾

创建主页、继承模版、显示特定主题页面

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 %}

localhost:8000/new_topic/显示:

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)
  1. 模版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 %}

localhost:8000/new_entry/3/运行显示:

相关推荐
结衣结衣.7 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐9 分钟前
C++:静态成员
开发语言·c++
TJKFYY9 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
杰哥在此18 分钟前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
小白学大数据19 分钟前
User-Agent在WebMagic爬虫中的重要性
开发语言·爬虫·http
ROBIN__dyc25 分钟前
C语言基本概念
c语言·开发语言
zaim12 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
学习使我变快乐2 小时前
C++:const成员
开发语言·c++
500了3 小时前
Kotlin基本知识
android·开发语言·kotlin
不知所云,5 小时前
qt cmake自定义资源目录,手动加载资源(图片, qss文件)
开发语言·qt