py17day22
一、related_name和related_query_name的区别
当一张表与主表存在1个以上一对多,或多对多关系时,一定要给外键字段设置related_name,不然会报错
related_name,用于定义反向关联时候,使用的字段名称
related_query_name 用于反向查询related_query_name + _set进行查询
class A: title = models.CharField() class B: xx ..xx fk1 = models.ForignKey(A,related_query_name='x') fk2 = models.ForignKey(A,related_name='u') obj = models.A.objects.get(id=1) obj.b_set.all() #反向查找关联的所有 obj.x_set.all() # 利用related_query_name='x'反向查找所有 obj.u.all() # 利用related_name='u'反向查找所有
二、through_fields的用途
当你需要操作第三张表时(多对多关系表)中的字段时,往往会手动创建,这时候设置的models.ManyToManyField字段往往要指定对应第三张表(多对多关系表)中的字段,我们可以用through_fields指定。
*注:through_fields = (关系表中与当前表建立foreignkey的字段名,关系表中与目标表建立foreignkey的字段名) 必须按这个顺序指定!!!
class News(models.Model): ... likes = models.ManyToManyField(to='UserInfo',through="Like",through_fields=('news','user',)) #默认联合唯一
#第三张表 class Like(models.Model): user = models.ForeignKey(to='UserInfo',related_name='good_user') news = models.ForeignKey(to='News',related_name='good_news') ctime = models.DateTimeField(verbose_name='点赞时间', auto_now_add=True) class Meta: #联合唯一 unique_together = [ ('user','news'), ]
三、django的事务提交
四、点赞的动画效果
五、多级评论的原理
六、上传文件(伪Ajax iframe实现)
七、request.post用法
八,跳转后保留原页面(POST后跳转至原页面)
#一个访问主机列表页面的host_list.html函数视图 def host_list(request): print(request.GET,type(request.GET)) # <QueryDict: {'id': ['10'], 'page': ['1']}> <class 'django.http.request.QueryDict'> # request.GET._mutable = True # 通过设置QueryDict对象的_mutable=True可以对其进行更改,不建议更改GET的QueryDict对象 obj = QueryDict(mutable=True) # 自定义一个QueryDict对象,设置其mutable=True obj['_url_args'] = request.GET.urlencode() # 将url?后的参数以键值对的形式保存到QueryDict对象 url_param = obj.urlencode() # 传给前端模板 print(url_param) # _url_args=id%3D10%26page%3D1
hosts = ['c1.com','c2.com','c3.com'] return render(request,'host_list.html',{'hosts':hosts,'url_param':url_param})
#添加主机add_host.html视图函数 def add_host(request): if request.method == "GET": # 点击“添加”按钮就是以GET方式访问add_host.html return render(request,'add.html') else: url_params = request.GET.get('_url_args') #得到之前封装的_url_args host = request.POST.get('hostname') url ="/host_list.html?"+url_params return redirect(url)

* 第一次以GET方式访问host_list.html时,request.GET.urlencode()即为红框里的值
#主机列表页面host_list.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--点击添加后,跳转后的页面会附带后端传的url_param--> <a href="/add_host.html?{{ url_param }}">添加</a> <ul> {% for item in hosts %} <li>{{ item }}</li> {% endfor %} </ul> </body> </html>
#add_host.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="POST"> <!--跳转原页面时,form不能设置action,默认post至当前页--> {% csrf_token %} <input type="text" name="hostname" /> <input type="submit" value="提交" /> </form> </body> </html>
*特别注意,若想POST方式提交跳转回原来的页面,form不能设置action参数!!!

点击"添加"后,跳转到的页面,保留了之前的_url_args
# 不定义QueryDict对象的方式,但是跳转路径不能附带参数 def host_list(request): print(request.GET,type(request.GET)) url_param = request.GET.urlencode() # 传给前端模板 print(url_param) hosts = ['c1.com','c2.com','c3.com'] return render(request,'host_list.html',{'hosts':hosts,'url_param':url_param}) def add_host(request): if request.method == "GET": # 点击“添加”按钮就是以GET方式访问add_host.html return render(request,'add.html') else: url_params = request.GET.urlencode() #得到之前的url_param host = request.POST.get('hostname') url ="/host_list.html?"+url_params #跳转回原来的附带url_param的页面 return redirect(url)

浙公网安备 33010602011771号