BBS项目总结
作者:互联网
目录
BBS总结
后端
1.如果要用forms组件就要先产生一个空对象
2.pillow模块
from PIL import Image,ImageFont,ImageDraw
Image # 生成图片对象
ImageDraw # 生成画笔对象,可以在图片上乱涂乱画
ImageFont # 如果生成文字可以控制字体的样式
案例:img_obj=Image.new('RGB',(350,35),三个数字产生颜色)
drow_obj=ImgDraw.Draw(img_obj)
font_obj=ImageFont.truetype('字体文件路径',字体大小)
draw_obj.text((i*60+45,0),产生的随机数字,font=font_obj)
验证码可以存在session中便于后须取出比对
3.io模块
from io import BytesIO,StringIO
BytesIO # 将数据保存在内存中取时以bytes类型返回
StringIO # 内存中保存数据且取时返回字符串
案例:
io_obj=BytesIO()
img_obj.save(io_obj,'png')
取io对象内的值io_obj.getvalue()
4.让前端识别语法的方法
from django.utils.safestring import mark_safe
mark_safe('前端代码')
5.bs4模块优化xss攻击问题
from bs4 import BeautifulSoup
soup=BeautifulSoup('content','lxml') # 产生一个对象
tags=soup.find_all() # 取出所有的标签
tag.decompose() # 移除标签
6.获取前端中的单选和多选
get('name属性')
getlist('name属性')
7.对于request.user属性的修改
request.user.属性=新属性
此操作临时之后修改要保存
request.user.save()
8.对于手动创建的第三张表关系
首先要有这个对象
再将它的多个关系通过for循环出来之后
article_obj = models.Article.objects.filter(pk=article_pk).first()
tag_id_list = request.POST.getlist('tag') # 多选 [1,2,3,4]
obj_list = []
for tag_id in tag_id_list: obj_list.append(models.Article2Tag(article=article_obj, tag_id=tag_id))
models.Article2Tag.objects.bulk_create(obj_list)
9.forms组件内控制文本框属性
widget=forms.widgets.TextInput(attrs={'class': 'form-control'})
widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'})
widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'})
widget=forms.widgets.EmailInput(attrs={'class': 'form-control'})
钩子函数:钩什么返回什么
self.add_error('字段','错误提示')
10.自关联
ForeignKey(to='self',null=True)
11.表再django注册与显示设置
admin.site.register(models.表名)
继承自带的认证表
from django.contrib.auth.models import AbstractUser
对于后台对表的展示在表内定义
class Meta:
verbose_name_plural = '用户表'
def __str__(self):
return self.想展示的字段名
12.处理时间的模块
from django.db.models.functions import TruncMonth
date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values(
'month').annotate(c=Count('pk')).values(
'month', 'c')
时间报错处理方法
修改配置 TIME_ZONE = 'UTC'改为TIME_ZONE = 'Asia/Shanghai',USE_TZ = False
指定认证表 AUTH_USER_MODEL = 'app01.UserInfo'
指定登录装饰器跳转的路由配置LOGIN_URL = '/login/'
指定用户上传文件的存放位置
MEDIA_ROOT = os.path.join(BASE_DIR, '指定文件夹名')
13.暴露项目中的资源
from django.views.static import serve
固定书写路由
url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
前端js总结
1.注册用户点击更换头像实时展示
// 用户头像实时展示
$('#avatar').change(function () {
// 1.产生一个文件阅读器对象
let myFileReader = new FileReader();
// 2.获取用户上传的头像文件
let avatarObj = this.files[0];
// 3.将文件对象交给阅读器加载
myFileReader.readAsDataURL(avatarObj) // IO操作 需要消耗时间 但是是异步
// 4.修改img标签的src属性
// 等待文件阅读器对象加载完毕之后再修改src属性
myFileReader.onload = function(){
$('#img').attr('src',myFileReader.result)
}
})
2.获取文件数据找到forms组件渲染的标签值
利用的主要是form表单生成标签
$.each($('#form').serializeArray(),function (index,dictObj) {
myFormData.append(dictObj.name,dictObj.value)
})
对于标签对象.files[0]
jquery查找的标签[0].files[0]
携带文件的参数
contentType:false
processDate:false
// 获取到了所有的字段错误提示 如何对应展示???
// 研究发现 渲染出来的标签id值都是 id_字段名 而后端返回的错误提示键是字段名 所以拼接即可
$.each(args.msg, function (i,j) {
let eleId = '#id_' + i;
$(eleId).next().text(j[0]).parent().addClass('has-error')
3.对于点击验证码
处理思路可以是将src属性值加上其他的符号即可重新发送请求获取
4.模板语法通过ajax传值需要变量要加上引号
5.针对有多个选项让用户选择时
{% for tag in tag_list %}
<input type="checkbox" name="tag" value="{{ tag.pk }}">{{ tag.name }}
{% endfor %}
6.编辑时有多个默认值时
{% for tag in tag_list %}
{% if tag in article_obj.tags.all %}
<input type="checkbox" name="tag" value="{{ tag.pk }}" checked>{{ tag.name }}
{% else %}
<input type="checkbox" name="tag" value="{{ tag.pk }}">{{ tag.name }}
{% endif %}
{% endfor %}
7.富文本类型
<script charset="utf-8" src="/static/kindeditor/kindeditor-all-min.js"></script>
<script>
KindEditor.ready(function(K) {
window.editor = K.create('#d1',{
width: '100%',
height:'600px',
resizeType:1,
uploadJson : '/file_upload/',
extraFileUploadParams : {
csrfmiddlewaretoken:'{{ csrf_token }}'
}
});
});
</script>
标签:总结,obj,name,项目,list,forms,tag,BBS,id 来源: https://www.cnblogs.com/ll71979461/p/16369424.html