pulish发布文章的原理:
①GET请求到html页面
②用户写发布文章的标题,简介,内容,种类,上传的图片
③POST这个页面
④服务器得到POST请求
⑤把数据保存在数据库中
⑥经过审核
⑦审核成功普通用户才能看到
views.py导入的第三方库
from django.http import HttpResponse
from django.shortcuts import render, redirect
from app01 import models
import json
views.py
def publish(request):
if request.method == 'GET':
kinds = models.Kind.objects.filter() #kind表,用于有哪些分类
response = {
'kinds': kinds
}
return render(request, 'publish.html', response) #传递分类到页面
elif request.method == 'POST':
# session获取uid
uid = request.session['uid']
# 提交发布的文章
t_title = request.POST.get('t_title')
t_introduce = request.POST.get('t_introduce') #简介
t_content = request.POST.get('t_content') #发表的内容
t_kind = request.POST.get('t_kind')
obj = models.Topic.objects.create(t_title=t_title, t_introduce=t_introduce,
t_content=t_content, t_kind=t_kind, t_uid=uid, is_approved=False) #is_approved=False 是待审核
t_id = obj.id #发表帖子的id,后期用于url的链接搜索
# 存帖子图片
t_photo = request.FILES.get('t_photo', None)
t_photo_path = 'static/img/t_photo/' + str(t_id) + '_' + t_photo.name
if t_photo: #如果有这个图片文件
# 保存文件
import os
f = open(os.path.join(t_photo_path), 'wb') #os.path.join拼接的功能
for line in t_photo.chunks(): #文件分块上传
f.write(line)
f.close()
# 吧图片路径存入数据库
models.Topic.objects.filter(id=t_id).update(t_photo='/'+t_photo_path)
return HttpResponse("等待急速审核❤")
models.py导入的第三方库
from django.db import models
models.py
# 分类表
class Kind(models.Model):
#k_id = models.CharField(verbose_name='分类id', max_length=16)
k_name = models.CharField(verbose_name='分类名称', max_length=16)
#就是数据迁移好之后,它会自动生成id.
# 帖子表
class Topic(models.Model):
# t_id = models.CharField(verbose_name='帖子id', max_length=16)
t_uid = models.CharField(verbose_name='帖子所属用户id', max_length=16)
t_kind = models.CharField(verbose_name='类别', max_length=32)
create_time = models.DateField(verbose_name='创建时间', auto_now_add=True)
t_photo = models.CharField(verbose_name='帖子图片', max_length=128, null=True)
t_content = models.CharField(verbose_name='帖子正文', max_length=3000)
t_title = models.CharField(verbose_name='帖子标题', max_length=64)
t_introduce = models.CharField(verbose_name='帖子简介', max_length=256)
recommend = models.BooleanField(verbose_name='是否推荐', default=False)
is_approved = models.BooleanField(default=False)
html
enctype="multipart/form-data"
是 HTML 中 form 表单的一个属性,它规定在表单数据(例如上传的文件)被提交到服务器时,编码类型应该是多部分的二进制数据流(MIME)。
当表单包含文件上传时,需要使用 enctype="multipart/form-data" 属性来指定表单数据的编码类型。这个属性告诉浏览器在提交表单数据到服务器之前应该如何编码数据。与默认的 application/x-www-form-urlencoded 不同,multipart/form-data 编码类型支持上传二进制文件和表单数据。
accept-charset="UTF-8" 是 HTML 表单元素的属性之一,表示该表单提交的数据的字符集编码方式为 UTF-8。
当表单的 method 属性为 POST 时,浏览器会将表单数据编码为一系列字节,并将它们包含在请求的正文中。如果表单中包含特殊字符(如非 ASCII 字符),则需要指定字符编码方式,以便服务器可以正确地解码接收到的数据。UTF-8 是一种常用的字符集编码方式,它可以支持包括中文、日文、韩文等在内的多种语言字符。因此,在处理表单数据时,指定 accept-charset="UTF-8" 可以确保数据的正确性和完整性。
在 HTML 中,id 和 name 都用于标识元素,但它们的用途略有不同。
id 属性用于唯一标识一个元素。它通常用于 JavaScript 操作和样式设置,因为一个 id 只能对应一个元素,可以确保操作或设置只对指定元素生效。
name 属性则用于在表单中标识一个元素。在表单提交时,表单元素的值会通过其 name 属性来发送给服务器。如果在表单中有多个相同的 name 属性,服务器将接收到一个数组,包含所有这些元素的值。
required 是一个表单元素属性,用于指定表单输入字段是否必填。如果 required 属性存在,则用户必须填写该字段才能提交表单。
id 是一个全局属性,用于给 HTML 元素指定唯一的标识符。它可以被用于将样式应用于元素,或者为元素创建脚本钩子。在表单中,id 属性可以用于将 label 元素与输入字段关联起来,使得点击标签时,输入字段获得焦点。
tr代表表格的行,通常包含一个或多个td元素。在HTML中,表格由一系列行组成,而每一行则由一系列单元格组成。所以,tr元素定义了表格中的一个行,它是一种容器元素,用于包含表格中的一组单元格。
td元素代表表格中的一个单元格,它是一个表格数据单元格。一个表格数据单元格通常包含一个文本字符串,但也可以包含其他HTML元素。
<form accept-charset="UTF-8" action="/publish/" class="publish" id="new_topic" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table width="100%" border="0" cellspacing="0" cellpadding="6">
<colgroup>
<col width="140">
<col>
</colgroup>
<tbody>
<tr>
<th>帖子标题</th>
<td>
<label>
<input required id="topic_title" maxlength="80" name="t_title" size="60" type="text">
</label>
</td>
</tr>
<tr>
<th valign="top">帖子简介</th>
<td>
<label>
<input required id="topic_introduce" maxlength="80" name="t_introduce" size="60" type="text">
</label>
</td>
</tr>
<tr>
<th valign="top">帖子内容</th>
<td>
<div class="body_count">
<textarea style="width: 700px;" cols="62" rows="20" name="t_content"></textarea>
</div>
</td>
</tr>
<tr>
<th>封面图</th>
<td>
<div>
<input type="file" name="t_photo" accept="image/*">
</div>
</td>
</tr>
<tr>
<th>类别</th>
<td>
<div>
<select name="t_kind">
{% for kind in kinds %}
<option value="{{ kind.id }}">{{ kind.k_name }}</option>
{% endfor %}
</select>
</div>
</td>
</tr>
<tr>
<th></th>
<td>
<button class="btn btn-large" type="submit">发表帖子</button>
</td>
</tr>
</tbody>
</table>
</form>