Django入门教程(九)表单练习

1、正所谓实践出真知,前面讲了那么多,现在我们进行form表单的一个小练习。虽然代码文中皆有体现,但也希望大家能在看完后有自己的思路,自己动手练习,提高自己。d=====( ̄▽ ̄*)b 顶
先给大家展示效果:
①这是打开首页的内容,默认展示一个城市的天气状况。
在这里插入图片描述

②输入一个城市,点击查询,会显示当天和后三天的天气状况。
在这里插入图片描述

2、这是我们默认提供的模板。通过我们的修改以达到上面的样式
在这里插入图片描述
3、准备材料

1、weather.html
下载网址:https://download.csdn.net/download/cf313995/10742274
本来不想要下载分的,,可是最少为1。。。
2、天气接口网址 http://api.map.baidu.com/telematics/v3/weather?location=郑州市&output=json&ak=TueGDhCvwI6fOrQnLM0qmXxY9N0OkOiQ&callback=?

4、动手实现。
(1)、思路

①诸如天气之类网页,打开会显示一个默认城市的近期天气状况。所以这里需要有一个默认的首页展示当天以及近几天的天气状况。
②打开index首页是一个get请求,而在输入框中输入一个城市,点击查询时,该采取get请求还是post请求。同时form表单的数据提交给谁,是自身还是其他的地址。
③假设我们form表单的数据提交给自身(即当前的url地址),同时采用的是get请求提交,再加上打开首页的get请求。如何让一个视图函数对应相同的get请求。
④假设我们form表单的数据提交给自身(即当前的url地址),同时采用的是post请求提交,再加上打开首页的get请求。如何让一个视图函数对应两个不同的请求。
对于和我一样的初学者, 以上这些问题都是我们需要考虑到的,虽然可能考虑的不全面。

(2)代码实现
①创建项目和app。这里利用pycharm的方式快速创建的项目(前文已提到,这里不再多讲解)。同时将我们的weather.html放入到templates文件夹(使用pycharm方式创建的项目templates已经配置过了)。项目整体结构如下:
在这里插入图片描述

②在urls.py文件中编写路由
在这里插入图片描述
③绑定视图函数,先将这个weather.html模板渲染到首页。
在这里插入图片描述
④运行查看,首页渲染成功。
在这里插入图片描述
⑤请求天气接口,并解析json数据,使得打开首页时展示一个默认城市的天气状况。这里默认城市以郑州市为例。

(1)、请求这个天气接口,查看响应结果,以便我们解析json数据。而我们想要的天气状况就在results这个字典的第0个元素中的weather_data这个列表中。

在这里插入图片描述

(2)、知道了这些,我们就可以编写代码了。

from django.shortcuts import render
import requests   #导入requests库,以便请求天气接口。

def index(request):
    url='http://api.map.baidu.com/telematics/v3/weather?location={}&output=json&ak=TueGDhCvwI6fOrQnLM0qmXxY9N0OkOiQ&callback=?'.format(郑州市)
    response=requests.get(url).json()    #调用requests库的json()方法转换成成字典
    weather_data=response['results'][0]['weather_data']			 #根据字典的键进行取值
    return render(request,template_name='weather.html',context={'weather_data':weather_data})		#渲染模板,同时将weather_data传递给模板

在这里插入图片描述

(3)、观察我们的weather.html,其中的main标签里的内容,使我们当天的天气状况,也就是wather_data这个列表中的第0个元素,列表中的每一个元素都是字典,再以键取值即可。现在我们修改weather.html模板中的main标签。
在这里插入图片描述

(4)、刷新查看,此时页面上的main标签范围的内容已经发生变化,达到我们期望的要求。
在这里插入图片描述
(5)、接下来就是将下方的footer中的内容进行修改,以实现进入首页展示默认的郑州市的天气状况。值得注意的是,因为我们的weather_data中的第0个元素(当天天气)已经给了main标签,而且footer中的内容也是从当天的后一天开始算起。所以我们应该加个判断,如果是第0个元素,就不取,反之,则取。
在这里插入图片描述
再次刷新
在这里插入图片描述
此时,默认城市的展示已经成功完成。
⑥接下来就是实现查询的功能,使得点击查询一个城市,显示当前城市近几天的天气状况。
此处,在点击查询时,如果我们也采用get请求的话,那么再加上渲染首页的get请求,这一个地址就对应了两个get请求,此时我们需要区分这两个请求,我们可以通过是否携带参数来判断。对于进入首页的get请求,它是不携带任何参数的,对于查询城市的get请求,它是需要携带一个参数city的。
(1)接下来就是get请求代码实现:

def index(request):
    '''
    这个视图函数对应了两个请求:
    1、访问天气首页,发送的get请求。2、提交form表单,发送GET请求
    上述情况可以使用:
    1、上述请求是否携带参数区分这两个请求。2、使用不同的请求来区分是刷新首页还是form表单请求。
    :param request:
    :return:
    '''

    try:
        current_city=request.GET['city']
    except:
        #访问首页路由,除了渲染html页面之外,还需要提供一个默认城市的天气。
        current_city = '郑州市'
    url = 'http://api.map.baidu.com/telematics/v3/weather?location={}&output=json&ak=TueGDhCvwI6fOrQnLM0qmXxY9N0OkOiQ&callback=?'.format(current_city)
    response = requests.get(url).json()
    weather_data = response['results'][0]['weather_data']
    return render(request, template_name='weather.html',context={'weather_data': weather_data, 'current_city': current_city})

在这里插入图片描述
(2)修改weather.html
在这里插入图片描述
(3)运行查看
在这里插入图片描述

如果查询采取的是post请求,同样也能实现。只需判断这个请求的类型即可。如果是get请求,那么它对应的一定就是加载首页的请求,而如果是post请求,那么它对应的就是点击查询的请求。这里就不做尝试了,仅附上代码实现。

    if request.method=='GET':
        #如果是GET请求,说明是刷新首页   
        current_city='郑州市'
    else:
        #如果是POST请求,说明是form表单请求
        current_city=request.POST.get('city')
    current_city='郑州市'
    url='http://api.map.baidu.com/telematics/v3/weather?location={}&output=json&ak=TueGDhCvwI6fOrQnLM0qmXxY9N0OkOiQ&callback=?'.format(current_city)
    response=requests.get(url).json()
    weather_data=response['results'][0]['weather_data']

总结:
同一个视图函数如何处理同一个类型的请求以及同一个视图函数如何处理不同类型的请求在此篇文章中已经讲到了,望读者细细体会。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值