首页 > 编程语言 >《python编程从入门到实践》day40

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

时间:2024-05-28 23:32:37浏览次数:12  
标签:--- form python 编程 request topic learning entry day40

# 昨日知识点回顾

        编辑条目及创建用户账户

        暂没能解决bug:

The view learning_logs.views.edit_entry didn't return an HttpResponse object. It returned None instead.

# 今日知识点学习

        19.2.5 注销

                提供让用户注销的途径

                1.在base.html中添加注销链接                

# base.html
<p>
	<a href = "{% url 'learning_logs:index' %}">Learning Log</a> -
	<a href = "{% url 'learning_logs:topics' %}">Topics</a> -
	{% if user.is_authenticated %}
		Hello, {{ user.username }}.
		<a href="{% url 'users:logout' %}">Log out</a>
	{% else %}
		<a href="{% url 'users:login' %}">Log in </a>
	{% endif %}
</p>

{% block content %}{% endblock content %}

                2.注销确认页面                

# learning_log\users\templates\registration\logged_out.html
{% extends "learning_logs/base.html" %}

{% block content %}
	<p>You have been logged out. Thank you for visiting!</p>
{% endblock content %}

 

        19.2.6 注册页面

                1.注册页面的URL模式

# users\urls.py
"""为应用程序users定义URL模式"""

from django.urls import path, include

from . import views

app_name = 'users'
urlpatterns = [
    # 包含默认的身份验证URL
    path('', include('django.contrib.auth.urls')),
    # 注册页面
    path('register/', views.register, name='register')
]

                 2.视图函数register()

# # users\views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm

# Create your views here.
def register(request):
    """注册新用户"""
    if request.method != 'POST':
        # 显示空的注册表单
        form = UserCreationForm()
    else:
        # 处理填写好的表单
        form = UserCreationForm(data=request.POST)
        
        if form.is_valid():
            new_user = form.save()
            # 让用户自动登录,再重定向主页
            login(request, new_user)
            return redirect('learning_logs:index')
        
        # 显示空表单或指出表单无效
        context = {'form': form}
        return render(request, 'registration/register.html', context)
        

                3.注册模版

# users\templates\registration\register.html
{% extends "learning_logs/base.html" %}

{% block content %}

	<form method='post' action="{% url 'users:register' %}" >
		{% csrf_token %}
		{{  form.as_p  }}

		<button name="submit">Register</button>
		<input type="hidden" name="next"
			value="{% url 'learning_logs:index' %}"  />		
	</form>

{% endblock content %}

                4.链接到注册页面

# base.html
<p>
	<a href = "{% url 'learning_logs:index' %}">Learning Log</a> -
	<a href = "{% url 'learning_logs:topics' %}">Topics</a> -
	{% if user.is_authenticated %}
		Hello, {{ user.username }}.
		<a href="{% url 'users:logout' %}">Log out</a>
	{% else %}
		<a href="{% url 'users:register' %}">Register </a>-
		<a href="{% url 'users:login' %}">Log in </a>
	{% endif %}
</p>

{% block content %}{% endblock content %}

19.3 让用户拥有自己的数据

        19.3.1 使用@login_required限制访问

                装饰器:放在函数定义前面的指令,能在函数运行前修改函数代码

                1.限制访问显示所有主题的页面                

# learning_logs/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required

# 导入所需数据相关联的模型
from .models import Topic, Entry
from .forms import TopicForm, EntryForm

# Create your views here.
def index(request):
    """学习笔记的主页"""
    # 传递两个实参:对象request以及一个可用于创建页面的模版
    return render(request, 'learning_logs/index.html')

@login_required
def topics(request):
    """显示所有的主题"""
    topics = Topic.objects.order_by('date_added')
---snip---
# settings.py
---snip(直到末尾)---

# 我的设置
LOGIN_URL = 'users:login'

                 2.全面限制对项目“学习笔记”的访问

# learning_logs\views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required

# 导入所需数据相关联的模型
from .models import Topic, Entry
from .forms import TopicForm, EntryForm

# Create your views here.
def index(request):
    """学习笔记的主页"""
    # 传递两个实参:对象request以及一个可用于创建页面的模版
    return render(request, 'learning_logs/index.html')

@login_required
def topics(request):
    """显示所有的主题"""
    topics = Topic.objects.order_by('date_added')
    # 定义一个将要发送模版的上下文
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

@login_required
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)

@login_required
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)

@login_required
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)

@login_required
def edit_entry(request, entry_id):
    """编辑既有条目"""
    entry = Entry.objects.get(id=entry_id)
    topic = entry.topic

    if request.method != 'POST':
        # 初次请求:使用当前条目填充表单
        form =EntryForm(instance=entry)
    else:
        # POST提交的数据:对数据进行处理
        form = EntryForm(instance=entry, data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('learning_logs:topic', topic_id=topic.id)

        context = {'entry': entry, 'topic': topic, 'form': form}
        return render(request, 'learning_logs/edit_entry.html', context)

        19.3.2 将数据关联到用户

                1.修改模型Topic

# models.py
from django.db import models
from django.contrib.auth.models import User


# Create your models here.
class Topic(models.Model):
    """用户学习的主题"""
    # 存储少量文本如名称、标题或城市,预留200字符空间
    text = models.CharField(max_length=200)
    # 记录日期和时间的数据,为True自动设置为当前日期和时间
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        """返回模型的字符串表示"""
        # 只显示条目前50字符,省略号指出显示的并非整个条目
        return f"{self.text[:50]}..."
    
    
class Entry(models.Model):
    """学到某个主题的具体知识"""
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    # 外键(foreign key)是一个数据库术语,它指向数据库另一条记录。
    # 次联删除:on_delete=models.CASCADE让Django在删除主题的同时删除所有与之相关联的条目
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 存储用于管理模型的额外信息
        verbose_name_plural = 'entries'

                2. 确定当前有哪些用户

                3.迁移数据库 

                重建数据库:python manage.py flush

        19.3.3 只允许用户访问自己的主题                

# views.py
---snip---
@login_required
def topics(request):
    """显示所有的主题"""
    topics = Topic.objects.filter(owner=request.user).order_by('date_added')
    # 定义一个将要发送模版的上下文
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)
---snip---

        19.3.4 保护用户的主体        

# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import Http404

---snip---

@login_required
def topic(request, topic_id):
    """显示单个主题"及所有的条目"""
    topic = Topic.objects.get(id=topic_id)
    # 确认请求的主题属于当前用户
    if topic.owner != request.user:
        raise Http404

---snip---

        19.3.5 保护页面edit_entry

# views.py
---snip---
@login_required
def edit_entry(request, entry_id):
    """编辑既有条目"""
    entry = Entry.objects.get(id=entry_id)
    topic = entry.topic
    if topic.owner != request.user:
        raise Http404
    
---snip---

        19.3.6 将新主题关联到当前用户

# views.py
---snip---
@login_required
def new_topic(request):
    """添加新主题"""
    if request.method != 'POST':
        # 未提交数据:创建一个新表单
        form = TopicForm()
    else:
        # POST提交的数据:对数据进行处理
        form = TopicForm(data=request.POST)
        if form.is_valid():
            new_topic = form.save(commit=False)
            new_topic.owner = request.user
            new_topic.save()            
            return redirect('learning_logs:topics')

    # 显示空表单后指出表单数据无效
    context = {'form': form}
    return render(request, 'learning_logs/new_topic.html', context)

---snip---

标签:---,form,python,编程,request,topic,learning,entry,day40
From: https://blog.csdn.net/m0_37565294/article/details/139248508

相关文章

  • 《python编程从入门到实践》day39加更
    #昨日知识点回顾    添加主题、条目#今日知识点学习    19.1.3编辑条目        1.URL模式edit——entry#learning_logs/urls.py---snip---#用于编辑条目的页面path('edit_entry/<int:entry_id>/',views.edit_entry,na......
  • 如何在Java中实现函数式编程?
    在Java中实现函数式编程的关键是使用Lambda表达式和函数式接口。下面是一个简单的示例,展示了如何使用Lambda表达式和函数式接口来实现函数式编程。首先,定义一个函数式接口,可以通过使用@FunctionalInterface注解来标记该接口为函数式接口。函数式接口只能包含一个抽象方法。......
  • AI程序员-人工智能编程助手
    AI程序员-人工智能编程助手在软件开发领域,人工智能编程助手正在逐步改变开发者的工作方式。这些工具利用先进的机器学习和大语言模型技术,帮助开发者提高生产效率,减少错误,并加速开发进程。本文将探讨人工智能编程助手的现状、主要工具及其带来的优势。人工智能编程助手的兴......
  • Python网络爬虫的时候json=就是让你少写个json.dumps()
    大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和我一样会有一个疑问吧,为啥这次要用json=data啊?因为请求头的content-type这里对......
  • CCF-CSP真题《202403-1 词频统计》思路+python满分题解
    哇q(≧▽≦q),第一次写博客,请大家多多关照○| ̄|_ 看到没啥人提供202403的第一题解题思路及python代码,刚好写完,心血来潮想分享解题思路,就写下了这篇博客,有其他的编码版本,欢迎大家一起探讨呀(虽然我是算法菜鸟┗(T﹏T)┛,但有问题,我会尽力回答的!!!)好了废话不多说,上解题思路!大概想了......
  • Python实训的心路历程——第2天
    今天看了:一文了解YOLOv8(附带各种任务详细说明链接):计算机视觉领域的新星https://blog.csdn.net/qq_42452134/article/details/135149531这篇能带你一步步从安装到实战,非常好用,good!【YOLOv8】实战一:手把手教你使用YOLOv8实现实时目标检测https://blog.csdn.net/virobotics/arti......
  • Java高并发编程详解:深入理解并发核心库(Java高并发编程详解:多线程与架构设计姊妹篇) (Ja
    我的阅读笔记:并发核心库概览:首先介绍Java并发核心库的组成,包括java.util.concurrent包下的主要类和接口,以及它们之间的关系。线程池技术:详细讲解Java中的线程池技术,包括线程池的创建、配置、使用以及调优。介绍不同类型的线程池(如FixedThreadPool、CachedThreadPool等)以及它们......
  • Python中的循环引用和垃圾回收
    引言在现代软件开发中,内存管理是保证程序性能和稳定性的关键因素之一。垃圾回收(GarbageCollection,GC)作为一种自动内存管理机制,它能够自动释放不再使用的内存资源,从而避免内存泄漏和程序崩溃。Python作为一种高级编程语言,其内置的垃圾回收机制对于开发者来说是一个强大的工具,但......
  • 基于Python的性能分析
    1、什么是性能分析字面意思就是对程序的性能,从用户角度出发就是运行的速度,占用的内存。通过对以上情况的分析,来决定程序的哪部份能被优化。提高程序的速度以及内存的使用效率。首先我们要弄清楚造成时间方面性能低的原因有哪些沉重的I/O操作,比如读取分析大文件,长时间执行数......
  • python 第四章 函数 (pycharm) (2)
    一:变量作用域变量的作用域就是指在代码中变量能使用的位置变量的引用deffunc(a):print(a)data=10func(data)#a=data参数a引用了data的数据data2=20func2(data2)变量的分类全局变量在函数外定义,可以在代码中任意位置使用的变量局部变量在函数......