第19章_用户账号——【3.让用户拥有自己的数据】的博客作业

Blog项目:确保每篇博文和特定用户相关联,确保任何用户都可访问所有的博文,确保只有已登录的用户能发表博文以及编辑既有博文。在让用户能够编辑其博文的视图中,在处理表单前确认用户编辑的是他自己发表的博文。

【准备工作】

1.Blog里打开命令行
2.激活虚拟环境:
blog_env\Scripts\activate
3.运行服务器:
python manage.py runserver
4.浏览器查看:
http://localhost:8000
5.Blog里再次打开命令行
6.激活虚拟环境:
blog_env\Scripts\activate

【都能看到所有博客但只有已登录能发表修改博文】

1.添加判断是否登录

打开F:\Blog\blogs\views.py,添加

from django.contrib.auth.decorators import login_required

在除了index()外的其他函数前面添加

@login_required

2.实现未登录则跳转到登录界面

打开F:\Blog\Blog\settings.py,在最下面添加

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

【将数据关联到用户】

1.将博文和用户建立联系

打开F:\Blog\blogs\models.py,修改为

from django.db import models
from django.contrib.auth.models import User  导入模型User
# Create your models here.
class BlogPost(models.Model):
	"""这个模型应包含title、text和date_added等字段"""
	title=models.CharField(max_length=20)
	text=models.TextField()
	owner=models.ForeignKey(User,on_delete=models.CASCADE)  #跟User建立联系
	date_added=models.DateTimeField(auto_now_add=True)
	class Meta:
		verbose_name_plural='blogposts'
	def __str__(self):
		"""将要显示的内容"""
		return self.title

2.查看当前用户

python manage.py shell
from django.contrib.auth.models import User
for user in User.objects.all():
print(user.username,user.id)
查看到myblog 1 guest 2

3.迁移数据库

(1)python manage.py makemigrations blogs
输入1,选择马上填写默认值
输入1,选择myblog
(2)python manage.py migrate

4.检验是否成功数据关联到用户

from blog.models import BlogPost
for blogpost in BlogPost.objects.all():
print(blogpost,blogpost.owner)
显示myblog用户名下的主题

【已登录用户可查看编辑自己的博文内容】

1.实现已登录方能查看博文内容和编辑博文内容

打开F:\Blog\blogs\views.py,导入Http404,添加check_user(),修改blogpost()

from django.http import Http404
def check_user(request,blogpost):
	"""检查要查看博文是否属于当前登录用户"""
	if blogpost.owner!= request.user:
		raise Http404
def blogpost(request,blogpost_id):
	"""展示某个帖子的内容"""
	blogpost=BlogPost.objects.get(id=blogpost_id)
	check_user(request,blogpost)  #等价于下面两行
	#if blogpost.owner!= request.user:
	#	raise Http404
	blogposttitle=blogpost.title
	blogposttext=blogpost.text
	blogpostid=blogpost.id
	context={'blogposttitle':blogposttitle,'blogposttext':blogposttext,'blogpostid':blogpostid}
	return render(request,'blogs/blogpost.html',context)

2.测试效果

在浏览器里分别登录两个用户,查看所有帖子,并分别点进博文去,只有myblog能查看博文内容并修改

【保护修改博文页面】

1.检查漏洞

登录第一个用户,查看一下所有情况下页面如下,复制到空白文档,重新登录新用户,复制粘贴链接查看
展示博文内容:http://localhost:8000/8
修改博文内容:http://localhost:8000/8/edit_blog
发布新帖内容:http://localhost:8000/new_blog/
发现登录账号后,直接输入http://localhost:8000/8/edit_blog能够修改其他用户博文

2.保护修改博文页面

打开F:\Blog\blogs\views.py,将edit_blog()函数修改为

def edit_blogpost(request,blogpost_id):
	blogpost=BlogPost.objects.get(id=blogpost_id)
	"""用户修改帖子内容的页面"""
	check_user(request,blogpost)  #判断是否为当前用户的博文
	if request.method != 'POST':
		form=BlogPostForm(instance=blogpost)
	else:
		form=BlogPostForm(instance=blogpost,data=request.POST)
		if form.is_valid():
			form.save()
			return HttpResponseRedirect(reverse('blogs:index'))
	context={'blogpost':blogpost,'form':form}
	return render(request,'blogs/edit_blog.html',context)

【将新主题关联到当前用户】

1.关联主题和用户

打开F:\Blog\blogs\views.py,将new_blogpost()修改为

def new_blogpost(request):
	"""用户发新帖页面"""
	if request.method != 'POST':
		form=BlogPostForm()
	else:
		form=BlogPostForm(request.POST)
		if form.is_valid():
			new_blogpost=form.save(commit=False)
			new_blogpost.owner=request.user
			new_blogpost.save()
			return HttpResponseRedirect(reverse('blogs:index'))
	context={'form':form}
	return render(request,'blogs/new_blog.html',context)

2.测验效果

在浏览器里尝试添加博文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anITfish

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值