django 06
现在我们需要创建一个关于博客的应用,用于书写发送博客。
现在我们在项目下新建一个python包-->blog .然后再这个blog包下新建一个models.py,里面写入我们的博客模型:
#usr/bin/python
#-*-coding:utf-8-*-
from django.db import models
from blog_user.models import BlogUser
class Blog(models.Model):
title=models.CharField(max_length=30,null=True)
content=models.CharField(max_length=500,null=True)
create_date=models.DateTimeField(null=True)
#关联主外键
blogUser=models.ForeignKey('blog_user.BlogUser',on_delete=None)
前三个为博客的标题,内容,创建时间,都不允许为空,第四个为作者,默认是登录的用户,这时我们需要关联外键到blog_user中的BlogUser上,同时需要导入包,并且设置删除删除博客时不删除外键。
现在我们需要将blog写入settings.py中的INSTALLED_APPS中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog_user.apps.BlogUserConfig',
'blog',
]
将'blog'添加进去即可。
现在我们需要执行manage 命令:
makemigrations blog;
sqlmigrate blog 0001;
migrate blog 0001;
执行第一条,将会在blog文件夹中生成一个migrations包,里面会0001_initial.py,然后执行下面两条迁移文件,执行完成之后,查看数据库,会发现新增了一张表:
现在我们将a.html改为saveblog.html,使其用于发布博客(因为原先的a页面是登录之后才可查看,正好可以用来改为发布博客)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
p{
color: green;
}
</style>
</head>
<body>
<p>发布博客</p>
<form method="post" action="saveblog">
{% csrf_token %}
<p>
请输入标题: <input type="text" name="title">
</p>
<p>
请输入内容: <textarea name="content"></textarea>
</p>
<p>
<input type="submit" name="" value="发布内容">
</p>
</form>
</body>
</html>
但是我们想让blog负责有关博客的内容,而blog_user只负责创建用户相关的内容。
现在我们在blog中创建urls.py与views.py两个文件。
urls.py:
#usr/bin/python
#-*-coding:utf-8-*-
app_name='blog'
from django.urls import path
from blog import views
urlpatterns = [
path('saveblog', views.saveblog),
]
同时将bolg_user中的urls里的原先的a路径删除,然后再在user中的urls总分发器中加入gy_01中urls的路径:
path('blog/', include('blog.urls',namespace='blog')),
views.py中将原先blog_user中views中的a方法剪切过去。
注意:将所有的a改为saveblog 并注意要倒包。
最后将welcome2中的发布博客的a链接路径改为:/blog/saveblog
现在我们打开网页进入发布博客页面的路径会显示为blog模块下的路径。
接下来我们需要将saveblog页面中用户写的博客存入到数据库中,在views中的saveblog方法中添加一个判断,判断是get提交还是post提交:
#usr/bin/python
#-*-coding:utf-8-*-
from django.shortcuts import render,reverse,redirect
from blog.models import Blog
import datetime
from blog_user.models import BlogUser
def saveblog(request):
if request.method=='GET':
#判断user是否在session中
if 'user' in request.session:
return render(request, 'user/saveblog.html')
#没有登录,记录下目标页面 去登录
else:
request.session['uri'] = request.get_raw_uri()
return redirect(reverse('user:login'))
elif request.method=='POST':
#保存数据库 创建模型 获取设置属性值 save()
blog= Blog()
blog.title = request.POST.get('title')
blog.content = request.POST.get('content')
#当前时间
blog.create_date= datetime.datetime.now()
#当前用户
session=request.session
u_id=session.get('u_id')
blog.blogUser_id=u_id
try:
blog.save()
return redirect(reverse('user:welcome2'))
except:
return render(request,'user/saveblog.html',{'error':'保存失败,系统异常'})
同时在blog_user中views中的login方法中 获取session时,添加一条:session['u_id']=bloguserSet.first().id
上述当为post提交时,首先创建了一个模型blog,然后获取了标题,内容,当前时间,最后获取了session,并从session获取到登录用户的id,然后做了一个try-except判断,如果没有发生异常,则提交会数据库中,并重定向到welcome2页面,如果发生异常,则在页面上显示一个异常报错(此时还需要在saveblog.html上添加{{ error }})。
上传文件
我们要明白files的方法
文件对象: request.FILES.get() # 获取上传的文件对象
文件对象.name # 就是文件名
文件对象.size # 就是文件字节
文件对象.chunks() # 这个方法里面存放了上传的文件内容
form 表单里面要添加一个特殊的参数 enctype="multipart/form-data" # 文件的传输配置
首先我们在static下创建一个文件夹files ,用于保存我们上传的文件。
然后更改b.html 用来上传文件:
<from method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
用户名:<input type="text" name="uname">
</p>
<p>
上传图片:<input type="file" name="myfile">
</p>
<p>
<input type="submit" value="上传">
</p>
</from>
然后更改blog_user中的views中的b方法:
import os
def b(request):
if request.method=='GET':
return render(request,'user/b.html')
elif request.method=='POST':
myfile = request.FILES.get('myfile')
path = os.path.join('files',myfile.name)
upfile = open(path,'wb+')
for row in myfile:
upfile.write(row)
upfile.close()
return HttpResponse('上传成功')
现在打开b页面即可上传文件,上传完成之后可去files中查看。