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)

 

 

 

posted @ 2017-10-02 19:48  Dylan_Wu  阅读(102)  评论(0)    收藏  举报