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

# 昨日知识点回顾

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

# 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 forms

from .models import Topic

class TopicForm(forms.ModelForm):
    class Meta:
        model = Topic
        fields = ['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 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

"""定义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 = 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)

                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/运行显示:

 

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值