博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 项目一补充
阅读量:5117 次
发布时间:2019-06-13

本文共 4625 字,大约阅读时间需要 15 分钟。

Django create添加数据后会返回新添加的数据行的queryset对象。从而获取自增id

 应用场景:添加新随笔之后,将根据自增id,添加文章详细表和文章标签关系表

 

一对一关系的外键反向查询:

obj = models.UserInfo.objects.filter(username='sw').first()
print(obj.blog.site)

- 对于Form组件错误信息
{
          __all__: [错误1,错误2]
           user: [错误1,错误2]
           password: [错误1,错误2]
}
# 获取整体错误信息
- 后台
                  print(obj.errors['__all__'])
                   print(obj.errors[NON_FIELD_ERRORS])
- 模板
                   {
{ obj.non_field_errors }}
PS: 为某个字段添加异常
                self.add_error('字段名称',错误异常对象)

ajax提交请求时携带CSRF的3种方法:

{% csrf_token %} 在网页中生成一个input标签隐藏起来 其value值为随机字符串,name为csrfmiddlewaretoken

{
{ csrf_token }} 直接在网页中生成一个随机字符串显示出来

 

1     var  csrf=$('input[name="csrfmiddlewaretoken"]').val()

        data:{'csrfmiddlewaretoken':csrf}

2           data:{'csrfmiddlewaretoken':'{
{ csrf_token }}'}

 

3          var token=$.cookie('csrftoken')

            headers:{'X-CSRFToken':token}

博客文章内容:可以加css标签等,在用户上传内容是要过滤script关键字(beautifulsoup)
                         <p>{
{ article.content|safe }}</p>

 

路由匹配:

          url(r'^(?P<site>\w+)/(?P<type>((tag)|(classfiy)|(datetime)))/(?P<typename>\w+-*\w*).html$',views.home,name='filter'),
          给url设置别名可以不用从上到下匹配url,直接找到对应的url正则
          给参数设置别名,可以在后台快速准确的找到不同参数(**kwargs)
           ((tag)|(classfiy)|(datetime))这个正则对应的是3个参数的'或'的关系

 

#自定义第三张表:自己反向关联article_tag表

                 all_count = models.article.objects.filter(blog=blog,article_tag__tag_id=typename).count()
#通过M2M字段:直接通过m2m字段名从article表跨到tag表里
                  v=models.article.objects.filter(blog=blog,tags__id=typename)

 

通过年月在数据库查找

方法一:
              all_count = models.article.objects.filter(blog=blog,create_time__startswith=typename).count()
方法二:
               all_count=models.article.objects.filter(blog=blog).extra(where=['strftime("%%Y-%%m",create_time)=%s'],params=[typename,]).count()

通过年月对数据表进行分组:

sqlite数据库:
                   select={'month':'strftime("%%Y-%%m",create_time)'}
                   date_list=models.article.objects.filter(blog=blog).extra(select=select).values('month').annotate(num=Count('aid'))
mysql 数据库
                       select = {'month': 'date_format(create_time,"%%Y-%%m")'}
                       date_list = models.article.objects.filter().extra(select=select).values('month').annotate(num=Count('aid'))

 

将某操作添加为事务,原子性操作:

from django.db import transaction

with transaction.atomic():

应用:

1 def up(request): 2     username=request.session.get('username') 3     status = {
'msg': '', 'type': None} 4 if username: 5 obj=models.user.objects.filter(nickname=username).first() 6 type=request.POST.get('type') 7 8 if type=='Y': 9 id = request.POST.get('id')10 try:11 from django.db import transaction12 with transaction.atomic():13 models.updown.objects.create(article_id=id,user_id=obj.uid,type=True)14 models.article.objects.filter(aid=id).update(up_count=F('up_count')+1)15 status['msg']='点赞成功'16 status['type']='True'17 return HttpResponse(json.dumps(status))18 except Exception as e:19 if models.updown.objects.filter(article_id=id,user_id=obj.uid,type=True).first():20 status['msg']='您已经点过赞了'21 return HttpResponse(json.dumps(status))22 else:23 status['msg']='您已经点过踩了,不能点赞了'24 return HttpResponse(json.dumps(status))25 else:26 id = request.POST.get('id')27 try:28 from django.db import transaction29 with transaction.atomic():30 models.updown.objects.create(article_id=id,user_id=obj.uid,type=False)31 models.article.objects.filter(aid=id).update(dowm_count=F('dowm_count')-1)32 status['msg'] = '点踩成功'33 status['type'] = 'False'34 return HttpResponse(json.dumps(status))35 except Exception as e:36 if models.updown.objects.filter(article_id=id,user_id=obj.uid,type=False).first():37 status['msg']='您已经点过踩了'38 return HttpResponse(json.dumps(status))39 else:40 status['msg']='您已经点过赞了,不能点踩了'41 return HttpResponse(json.dumps(status))42 else:43 status['msg']='请先登录'44 return HttpResponse(json.dumps(status))
点赞

点赞:ajax请求,
               逻辑:只能点击其中一个且不能取消
               事务性操作:后台更新数据库
               前端:给页面数字加一

 

删除用户的session(浏览器端)
key=request.session.session_key
request.session.delete(key)

删除用户的session(数据库端和浏览器端)

from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
session = DatabaseSession()
session.clear()
session.delete(session.session_key)
request.session.flush()

应用:用户退出

 

 

自定义博客主题:

{% block css %}
<link rel="stylesheet" href="/static/css/theme/{
{ dict.blog.theme }}.css">
{% endblock %}

转载于:https://www.cnblogs.com/liuguniang/p/7233149.html

你可能感兴趣的文章
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
poj1201 查分约束系统
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>
安装 Express
查看>>
包含列的索引:SQL Server索引的阶梯级别5
查看>>
myeclipse插件安装
查看>>
浙江省第十二届省赛 Beauty of Array(思维题)
查看>>
NOIP2013 提高组 Day1
查看>>
个人对vue生命周期的理解
查看>>
cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>