Python 从0开始 一步步基于Django创建项目(13)将数据关联到用户

在city_infos应用程序中,每个城市信息条目是关联到城市的,所以只需要将城市条目关联到用户即可。

将数据关联到用户,就是把‘顶层’数据关联到用户。

设计思路:

1、修改顶层数据模型,向其中添加‘用户’属性

2、根据模型更新数据库

3、在数据显示部分,根据发起request的用户,显示与该用户匹配的内容

1)在cities页面显示与用户关联的city信息条目

2)在city页面,显示与那些city信息条目关联的具体信息

3)用户不能查看与自己不匹配的edit_entry页面,更不能进行编辑

4、将新主题关联到用户

5、确保主题下的新条目是其隶属的用户添加

步骤如下:

1、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的models.py文件。

首先在文件中包含django自带的User类。

from django.contrib.auth.models import User

然后修改City类

owner = models.ForeignKey(User,on_delete=models.CASCADE)

给City类添加owner属性,该属性值是User对象的ID,User对象的ID作为外键,与City对象相关联。采用级联删除,即删除对象的同时,删除该对象关联的City。

2、确认有哪些User对象的ID可用

使用django shell查询当前的用户信息。获得两个用户名称,及其ID。

(sg_env) C:\D\Python\Python310\study\snap_gram>python manage.py shell
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: sg_admin>, <User: 12344321>]>
>>> for user in User.objects.all():
...     print(user.username,user.id)
...
sg_admin 3
12344321 4
>>>

3、根据模型,更新数据库,

首先,生成数据库更新文件0002_city_owner。在文件中,要求将City表中,所有条目关联到ID为3的用户,即sg_admin

(sg_env) C:\D\Python\Python310\study\snap_gram>python manage.py makemigrations city_infos
It is impossible to add a non-nullable field 'owner' to city without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:1) Provide a one-off default now (will be set on all existing rows with a null value for this column)2) Quit and manually define a default value in models.py.
Select an option: 1
Please enter the default value as valid Python.
The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.
Type 'exit' to exit this prompt
>>> 3
Migrations for 'city_infos':city_infos\migrations\0002_city_owner.py- Add field owner to city

其次,使用该更新文件,更新数据库。

(sg_env) C:\D\Python\Python310\study\snap_gram>python manage.py migrate
Operations to perform:Apply all migrations: admin, auth, city_infos, contenttypes, sessions
Running migrations:Applying city_infos.0002_city_owner... OK

4、使用django shell查看city信息,确认数据库修改成功

(sg_env) C:\D\Python\Python310\study\snap_gram>python manage.py shell
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from city_infos.models import City
>>> for city in City.objects.all():
...     print(city.name,city.owner)
...
北京 sg_admin
墨尔本 sg_admin
悉尼 sg_admin
>>>

5、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的views.py文件,修改cities函数。使得登录用户只能查看隶属于自己的city条目。

@login_required
def cities(request):#request中包含发起请求的用户信息,核对用户信息与city的owner属性#用户信息一致,才能通过filter检查,展现出来cities = City.objects.filter(owner=request.user).order_by('date_added')context = {'cities':cities}return render(request,'city_infos/cities.html',context)

6、使用不同用户登录,查看cities页面

当以用户12344321登录时查看不到任何city信息,如下图所示:

以用户sg_admin登录时,则可查看到city信息,因为已经将这些信息全部关联到该用户。

7、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的views.py文件,修改city函数。使得登录用户只能查看隶属于自己的entry条目。

如果不做此处的修改,任何已登录的用户都可输入类似于http://localhost:8000/cities/1/的URL,来访问不隶属于自己的city主题的页面。

from django.http import Http404@login_required
def city(request,city_id):city = City.objects.get(id=city_id)#核对用户,显示隶属于该用户的信息,否则抛出404错误if city.owner != request.user:raise Http404entries = city.entry_set.order_by('date_added')context = {'city':city,'entries':entries}return render(request,'city_infos/city.html',context)

8、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的views.py文件,修改edit_entry函数。使得登录用户只能查看隶属于自己的entry条目。

如果不做此处修改,将出现下图的问题。12344321用户查看了不隶属于自己的city的条目,并能够打开和编辑edit_entry页面

修改程序如下:

@login_required
def edit_entry(request,entry_id):#request=GET时,返回原有Entry内容,request=POST时,提交新Entry内容entry = Entry.objects.get(id=entry_id)  # 找到指定的entrycity = entry.city#检查用户匹配if city.owner != request.user:raise Http404if request.method != 'POST':#初次请求,使用当前条目填充表单form = EntryForm(instance=entry)else:#处理POST提交的数据form = EntryForm(instance=entry, data=request.POST)if form.is_valid():  # Django自动检查提交数据的合法性form.save()return redirect('city_infos:city',city_id=city.id)  # 页面重定向context = {'entry':entry,'city': city, 'form': form}  # 程序不进入if块,或者没有通过有效性验证,都执行该行代码return render(request, 'city_infos/edit_entry.html', context)

9、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的views.py文件,修改new_city函数。将新主题关联到用户。

@login_required
def new_city(request):'''Add new City'''if request.method != 'POST':#未提交数据时,创建一个新表单,此时request.method=='GET'form = CityForm()else:#提交数据时form = CityForm(data=request.POST)#data是用户刚刚POST的数据,如此则form包含用户提交的数据if form.is_valid():#Django自动检查提交数据的合法性new_city = form.save(commit=False) #commit=False表示先不写库new_city.owner = request.usernew_city.save() #改完了owner属性,然后写库return redirect('city_infos:cities')#页面重定向context = {'form':form}#程序不进入if块,或者没有通过有效性验证,都执行该行代码return render(request,'city_infos/new_city.html',context)

10、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的views.py文件,修改new_entry函数。确保新增条目隶属的city,隶属于当前用户。

@login_required
def new_entry(request,city_id):'''Add new Entry to specific city'''city = City.objects.get(id=city_id)#找到指定的city#核实用户if city.owner != request.user:raise Http404if request.method != 'POST':#未提交数据时,创建一个新表单,此时request.method=='GET'form = EntryForm()else:form = EntryForm(data=request.POST)  # data是用户刚刚POST的数据,如此则form包含用户提交的数据if form.is_valid():  # Django自动检查提交数据的合法性#commit=False的作用:让Django创建一个新条目,赋值给new_entry,但是不保存到数据new_entry = form.save(commit=False)#通过设定city,将新条目与指定city关联new_entry.city = city#再将新条目,保存到数据new_entry.save()return redirect('city_infos:city',city_id=city_id)  # 页面重定向context = {'city':city,'form':form}#程序不进入if块,或者没有通过有效性验证,都执行该行代码return render(request, 'city_infos/new_entry.html', context)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寄主机显示器被快递搞坏了怎么办?怎么破?

大家好&#xff0c;我是平泽裕也。 最近&#xff0c;我在社区里看到很多关于开学后弟弟寄来的电脑显示器被快递损坏的帖子。 看到它真的让我感到难过。 如果有人的数码产品被快递损坏了&#xff0c;我会伤心很久。 那么今天就跟大家聊聊寄快递的一些小技巧。 作为一名曾经的…

【AIGC调研系列】Starling-LM-7B模型与其他模型相比的优势和劣势

Starling-LM-7B模型与其他7B模型相比&#xff0c;具有以下优势和劣势&#xff1a; 优势&#xff1a; 融合了监督学习和强化学习的优势&#xff1a;Starling-LM-7B的训练过程结合了监督学习和强化学习的优点&#xff0c;专注于提高模型的帮助性和减少潜在的危害[1][6]。这种混…

论文《Exploring to Prompt for Vision-Language Models》阅读

论文《Exploring to Prompt for Vision-Language Models》阅读 论文概况论文动机&#xff08;Intro&#xff09;MethodologyPreliminaryCoOp[CLASS]位置Context 是否跨 class 共享表示和训练 ExperimentsOverall ComparisonDomain GeneralizationContext Length (M) 和 backbon…

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构&#xff0c;其中编码器将…

CUDA从入门到放弃(七):流( Streams)

CUDA从入门到放弃&#xff08;七&#xff09;&#xff1a;流&#xff08; Streams&#xff09; 应用程序通过流来管理并发操作&#xff0c;流是一系列按顺序执行的命令。不同的流可能无序或并发地执行命令&#xff0c;但此行为并不保证。流上的命令在依赖关系满足时执行&#…

【设计模式】抽象工厂模式详解

抽象工厂 是一种为访问类提供一个创建一族相关或者相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具体类就可以得到同一族的不同等级的产品模式结构 抽象工厂模式是工厂方法模式的升级版本&#xff0c;工厂方法模式只生产一个等级的产品&#xff0c;而抽象工厂模式…

Android room 在dao中不能使用挂起suspend 否则会报错

错误&#xff1a; Type of the parameter must be a class annotated with Entity or a collection/array of it. kotlin.coroutines.Continuation<? super kotlin.Unit> $completion); 首先大家检查一下几个点 一、kotlin-kapt 二、 是否引入了 room-ktx 我是2024年…

Vue CLI 配置与 Nginx 反向代理:无缝连接前后端API通信

在Web开发中&#xff0c;Vue.js用于构建单页面应用。在前后端分离的架构中&#xff0c;Vue应用通常需要通过API与后端服务器交互。所以&#xff0c;Vue CLI工具提供了便捷的开发环境配置选项&#xff0c;而Nginx则在生产环境中扮演关键角色&#xff0c;确保API请求正确路由至后…

[flink] flink macm1pro 快速使用从零到一

文章目录 快速使用 快速使用 打开 https://flink.apache.org/downloads/ 下载 flink 因为书籍介绍的是 1.12版本的&#xff0c;为避免不必要的问题&#xff0c;下载相同版本 解压 tar -xzvf flink-1.11.2-bin-scala_2.11.tgz启动 flink ./bin/start-cluster.sh打开 flink web…

LeetCode 面试经典150题 242.有效的字母异位词

题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 思路&#xff1a;hash表&#xff0c;可以用int数组代替 代码&#x…

【每日一题】盛水容器

问题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

JavaScript中作用域与闭包深入解析

函数中的作用域 对这些问题的最常见的回答是&#xff0c;JavaScript 拥有基于函数的作用域。也就是&#xff0c;你声明的每一个函数都为自己创建了一个气泡&#xff0c;而且没有其他的结构可以创建它们自己的作用域气泡。但是就像我们一会儿将会看到的&#xff0c;这不完全正确…

vue创建项目报错Fail to check for updates

网上查了文章说更换淘宝镜像地址啥的 改了地址后依然报错显示Fail to check for updates 并且装包时报错Failed to get response from https://registry.npmmirror.com/binary-mirror-config 既然又是淘宝镜像问题&#xff0c;直接干脆不用淘宝的地址 npm config set regis…

iPhone的iOS系统:定义移动智能体验,引领科技潮流之巅

来自&#xff1a;dlshuhua.com/post/83721.html 在移动智能设备领域&#xff0c;iPhone一直以其出色的性能和独特的用户体验脱颖而出。而这一切的背后&#xff0c;离不开其强大的操作系统——iOS。iOS系统不仅为iPhone提供了强大的性能支持&#xff0c;更通过不断创新和升级&a…

蓝桥杯备考随手记: 数位分解

1. 什么是数位分解 数位分解是将一个数拆分成它的各个数位的过程。每个数位代表了数字在该位上的权重。 例如&#xff0c;对于整数12345&#xff0c;数位分解可以得到以下结果&#xff1a; 万位&#xff1a;1千位&#xff1a;2百位&#xff1a;3十位&#xff1a;4个位&#…

产品经理的自我修养

点击下载《产品经理的自我修养》 1. 前言 在产品领域取得成功的关键在于持续的激情。只有保持热情不减,我们才能克服各种困难,打造出卓越的产品。 如果你真心渴望追求产品之路,我强烈建议你立即行动起来,亲自参与实际的产品创作。无论是建立一个网站、创建一个社群,还是…

Dubbo 负载均衡算法说明

https://cn.dubbo.apache.org/zh-cn/overview/core-features/load-balance/ 在集群负载均衡时&#xff0c;Dubbo 提供了多种均衡策略&#xff0c;缺省为 weighted random 基于权重的随机负载均衡策略。 具体实现上&#xff0c;Dubbo 提供的是客户端负载均衡&#xff0c;即由 …

【前端学习——js篇】4.浅拷贝与深拷贝

具体可见https://github.com/febobo/web-interview 4.浅拷贝与深拷贝 ①栈内存与堆内存 栈内存&#xff08;Stack Memory&#xff09; 栈内存用于存储基本类型的变量和引用类型的变量引用&#xff08;即指向堆内存中实际数据的指针&#xff09;。当一个函数被调用时&#xf…

Mysql的日志管理,备份与回复

目录 一、Mysql日志管理 1、日志的默认位置及配置文件 2、日志分类 2.1错误日志 2.2通用查询日志 2.3二进制日志 2.4慢查询日志 2.5中继日志 3、日志配置 4、日志查询 4.1查询通用日志是否开启 4.2查询二进制日志是否开启 4.3查看慢查询日志是否开启 4.4查询慢查…