使用Python Django开发时遇到的问题

目录

模型类中条件查询filter返回值问题

Django分页的GET与表单的POST冲突

VS编译器中自带的html页面中文乱码

render调用页面时,无法执行相应views.py中的代码

登录后显示用户头像(session)

 通过字典实现ORM filter动态修改字段名进行查询

 回退到首页时,显示历史搜索的关键字


模型类中条件查询filter返回值问题

将表单传来的key值作为数据表title字段的查询条件

即使数据库中符合条件的只有一行数据,最外层也会有一个QuerySet类数组来包裹。即list不是Message类,需要list[0]将Message取出,如果需要输出查询的数据title字段的值,就如下图(Message类中定义了title属性)

获取到类名list[0]后,访问属性值就不言而喻了。

Django分页的GET与表单的POST冲突

众所周知Django分页较为容易的是使用查询字符串?page=x来传递当前页的,是一个GET请求,可如果分页的对象是表单经POST提交之后的页面呢,点击页码后通过GET请求来刷新页面,显然会报错。

我的思路是表单提交后将关键信息记录到文件中去,这样即使点击页码后,也能通过读取文件的方式来重新获取关键信息,可在类中进行是否post的判断:

    if(request.method == 'POST'):
        f = open('XunLu_details/doc/keyword.txt','w')
        f.write(request.POST['key'])
        f.close()

之后只要是刷新页面均从该文件获取关键信息,

 通过这种方式将信息按关键字查询并将数据data传入分页Paginator类中

VS编译器中自带的html页面中文乱码

在自带的html页面中加入中文会报错UnicodeDecodeError。

首先确保vs与浏览器的编码格式是utf-8,可能该html页中延用了之前的编码格式,将此页删除再创建即可(复制粘贴便可)。

render调用页面时,无法执行相应views.py中的代码

在首页的控制层中有很多逻辑判断的代码,可是如果直接执行如下语句,这些代码都不会起作用:

return render(request,'app/index.html')

可以考虑引入django.http.HttpResponseRedirect来改变url,这样通过以配置好的路由来加载页面:

return HttpResponseRedirect('/')#默认路由即为首页

附:判断session有无某关键字(in/not in):

    #每一次返回首页需要超链接或重定向更改地址,不能用render
    #session中若无值阻止报错
    if('username' not in request.session):
        #将session赋予默认值,其中空值则显示默认图片
        request.session['username'] = '请先登录'
        request.session['userIcon'] = 'Xunlu/images/noUser.jpg'

登录后显示用户头像(session)

首先登录后再session添加userIcon关键字(django默认是支持session的,详见下方参考链接):

        if(userList.password == request.POST['password']):
            request.session['username'] = userList.username
            request.session['userIcon'] = str(userList.icon)
            return HttpResponseRedirect('/')

python中将session值作为一个字典来处理

前台调用session:

                    <li><a href="/admin"><img class="userImg" src="{%static request.session.userIcon%}" alt="用户头像" /></a></li>
                    <li><a href="/" style="color:black;">欢迎您,

小技巧:当登录为空值时,可给session一个默认值,实现无用户登录时的默认图片:
 

        request.session['username'] = '请先登录'
        request.session['userIcon'] = 'Xunlu/images/noUser.jpg'

Django中使用sessionhttps://blog.csdn.net/zy010101/article/details/121065864

 通过字典实现ORM filter动态修改字段名进行查询

条件查询的代码:

#根据条件筛选
    if(hasCondition):
        if(conditionOp == '<'):
            #可通过字典类型来灵活设定查询字段
            dict = {conditionKey+'__lte':conditionValue}
        elif(conditionOp == '>'):
            dict = {conditionKey+'__gte':conditionValue}
        else:
            dict = {conditionKey:conditionValue}
        data = data.filter(**dict).order_by('-hits')

 分了三种情况,对应三个字典,它们分别是:

{"hits__lte":10}

{"hits__gte":10}

{"hits":10}

 filter里面用**dict调用字典,分别等价于:

filter(hits__lte=10)

filter(hits__gte=10)

filter(hits=10)

 回退到首页时,显示历史搜索的关键字

之前说到关键字被我们存在了一个文件doc/keyword.txt中,只需要返回时传入一个参数,首页来判断若该参数存在便将文件内容读入显示即可,具体代码如下:

详情页--以history作为历史参数

            <div class="col-md-9">
                迅鹿为您找到{{count}}个相关网页 <a href="/?history=True">返回首页</a><br />

首页后端--

#判断是否需要记录历史查询
    if('history' in request.GET):
        if(request.GET['history']):#是布尔类型
            #读取文件记录,获取最近查询的关键字
            with open('XunLu_details/doc/keyword.txt','r') as f:
                historyKey = f.read()


版权声明:本文为Mr_Joer原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。