0826自我总结
django-搭建BBS关键点总结
一.关于开口子,直接输入url访问文件内容
django
自带开了个口子是static文件可以直接访问到
手动开口子
urs.py
from django.views.static import serve
urlpatterns = [
url(r'^avatar/(?P<path>.*)', serve, kwargs={'document_root': 开口文件的路径}),
]
#这里的r'^avatar/(?P<path>.*),前面的路径等同于后面设置的路径,而下面正则匹配的内容为内容的拼接前面的就是完整的一个路径,这样就可以url直接访问文件夹
二.关于登入验证码中解决并发的问题
解决方法
:将code存在session中
注意点
:如果同时在一个浏览器中打开两个相同的网页,他的code以后的那个网站为准,这是session的特性
三.验证码的生成
https://www.cnblogs.com/pythonywy/p/11408318.html
四.登入后的重要操作
可以利用的auth模块中的login
在登入成功的时候
将uesr对象存放在request中方便后续操作
auth.login(request,user)
也可以在网页中完成是否登入的判断
{% if request.user.is_authenticated %}
完成注销操作
auth.logout(request)
五.表单的查找
#查询当前站点下所有标签对应的文章数
#查询当前站点下所有分类对应的文章数
# 查询所有分类对应的文章数
# 分组查询固定规则:
# filter 在annotate前表示where条件
# values 在annotate前表示group by
# filter 在annotate后表示having条件
# values 在annotate后表示取值
# category_ret=models.Category.objects.all().values('pk').annotate(cou=Count('article__nid')).values('title','cou')
# 查询当前站点下所有分类对应的文章数
category_ret=models.Category.objects.all().filter(blog=blog).annotate(cou=Count('article__nid')).values_list('title','cou','nid')
print(category_ret)
# 查询当前站点下所有标签对应的文章数
tag_ret=models.Tag.objects.all().filter(blog=blog).annotate(cou=Count('article__nid')).values_list('title','cou','nid')
print(tag_ret)
#查询某年某月下对应的文章数
'''
from django.db.models.functions import TruncMonth
Sales.objects
.annotate(month=TruncMonth('timestamp')) # Truncate to month and add to select list
.values('month') # Group By month
.annotate(c=Count('id')) # Select the count of the grouping
.values('month', 'c') # (might be redundant, haven't tested) select month and count
'''
year_ret=models.Article.objects.all().annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('nid')).values_list('month','c')
关键点
:
- 主键可以直接缩写成
pk
- 关于annotate
- 只要是两个 model 类通过 ForeignKey 或者 ManyToMany 关联起来,那么就可以使用 annotate 方法来统计数量。
- annotate(字段名称=聚会函数)
- annotate 前面有values时候,主要是加快的查询的速度,values中必须要有annotate的依据
六.自定义文件夹存储路径
settings.py
#加这两句,以后再上传的图片,都放在media文件夹下
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
# MEDIA_ROOT = os.path.join(BASE_DIR, "app01")