可以参考这里
一、申请API
https://home.openweathermap.org/api_keys
二、建立环境
首先在本地web文件夹下面建立一个项目文件平,然后执行以下的命令。
当然也可以直接用django创建,可是通过pythonhosted.org安装在我电脑会很慢。
pip install virtualenv virtualenv weather_venv #注意后面加个_env cd weatherv_env/Scripts/ activate cd.. cd..
三、建立django项目
1. 安装指定版本django
pip install django==2.0 #pip install django==2.0 -i https://pypi.douban.com/simple/
2.建立django APP
进入到项目文件夹,执行
django-admin startproject the_wedather
再进入这个the_wedather文件夹。(其实这一步不操作也可以的)
python manage.py startapp weather
然后在settings.py下面,新增这个app.
3.建立数据库。
执行下面的命令,就会在项目下生成一个sqlite的数据库。
python manage.py migrate
如果你想使用mysql作为数据库,那么先修改settings.py文件,再执行上面的命令。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'jd', 'USER': 'jd', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '3306', } }
如果报错,Error loading MySQLdb module. Did you install mysqlclient
直接安装mysql-python也安装不上,建议安装pymql:
pip3 install pymysql
django项目__inti__.py中添加以下代码
import pymysql pymysql.install_as_MySQLdb()
参考:https://blog.csdn.net/feiyanlhj/article/details/87342754
4.建立superuser
python manage.py createsuperuser 5.添加app 将app添加到settings.py中的INSTALLED_APPS里面。 6.测试
然后runserver看一下是否能看到首页。
python manage.py runserver
如果可以,就交给pycharm吧。
四、模板文件
1.在weather文件夹下面建立一个templates文件夹。
2.在templates文件夹下面建立一个weather文件夹,和app的名称一样。
3.将weather.html文件复制到这个文件夹。
weather
小提示:
关于模板的继承,请看这里
4. 修改url.py
from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('', include('weather.urls')), ]
小提示:
这里原教程也有问题,weather.urls不加引号的话,会出现“NameError: name 'weather' is not defined”的出错提示。
5.在weather文件夹下面,建立一个urls.py
from django.urls import path from . import views urlpatterns = [ path('',views.index), ]
6.修改weather文件夹下面的views.py
def index(request): return render(request,'weather/weather.html')
最后的文件夹结构是这样的:
7.修改模板文件
{% load staticfiles %} <link rel="stylesheet" type="text/css" href="{%static 'css/bootstrap.css'%}" />
8.添加static路径
修改settings.py文件
这个还一定要加,虽说Django 默认会在 STATICFILES_DIRS中的文件夹 和 各app下的static文件夹中找文件。但是我试过不加就找不到静态文件。
STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), )
成果展示:
9.如果要分页,请看这里
五、从API取数
1.测试API
修改views.py
import requests from django.shortcuts import render # Create your views here. def index(request): url = 'http://api.openweathermap.org/data/2.5/weather?q={}&appid=这里填你的API key' city = 'New york' r = requests.get(url.format(city)) print(r.text) return render(request,'weather/weather.html')
然后可以从终端看到取到的数。
2.取数
r = requests.get(url.format(city)).json() city_weather = { 'city':city, 'temperature':r['main']['temp'], 'description':r['weather'][0]['description'], 'icon':r['weather'][0]['icon'], } print(city_weather)
然后可以在终端看到已经取到了数:
3.将数据传到模板
content = {'city_weather':city_weather} return render(request,'weather/weather.html',content)
4.修改模板
<div class="box"> <article class="media"> <div class="media-left"> <figure class="image is-50x50"> <img src="http://openweathermap.org/img/w/{{ city_weather.icon }}.png" alt="Image"> </figure> </div> <div class="media-content"> <div class="content"> <p> <span class="title">{{ city_weather.city }}</span> <br> <span class="subtitle">{{ city_weather.temperature }}° F</span> <br> {{ city_weather.description }} </p> </div> </div> </article> </div>
成果展示:
六、添加多城市功能
1.修改models.py
添加以下代码:
class city(models.Model): name = models.CharField(max_length = 25) def __str__(self): return self.name class Meta: verbose_name_plural = 'cities'
2.执行以下命令
python manage.py makemigrations python manage.py migrate
备注:
如果先前设计好数据库的字段,后面又需要修改,可以先修改models,然后再执行上面的两条命令。不过如果数据库有数据,则可以通过两种方法解决:
1、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)
2、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值(default=None,默认值为空)
不过我使用了第二种方法,添加了一个“unique_id”字段,还是出现django.db.utils.IntegrityError: NOT NULL constraint failed: weather_hoursforecas
t.unique_id 的报错信息。
3.修改admin.py,在后台注册citys
from django.contrib import admin from .models import city admin.site.register(city)
然后进入后台就可以看到citys了。
4.添加几个城市
5.修改views.py
import requests from django.shortcuts import render from .models import City # Create your views here. def index(request): url = 'http://api.openweathermap.org/data/2.5/weather?q={}&appid=你的API' cities = City.objects.all() weather_data = [] for city in cities: r = requests.get(url.format(city)).json() city_weather = { 'city':city.name, 'temperature':r['main']['temp'], 'description':r['weather'][0]['description'], 'icon':r['weather'][0]['icon'], } weather_data.append(city_weather) content = {'weather_data':weather_data} return render(request,'weather/weather.html',content)
6.在模板文件中加以下代码:
{% for city_weather in weather_data %} {% endfor %}
成果展示:
七、添加“add city”功能
1.建立文件
在weather文件夹下面建立一个forms.py文件。
from django.forms import ModelForm,TextInput from .models import City class Cityform(ModelForm): class Meta: model = City fields = ['name']
2.修改views.py
from .forms import Cityform if request.method =='POST': pass form = Cityform() content = {'weather_data':weather_data,'form':form} widgets = {'name':TextInput(attrs={'class':'input','placeholder':'City Name'})}
3.修改模板文件:
</section> <section class="section"> <div class="container"> <div class="columns"> <div class="column is-offset-4 is-4"> <form method="POST"> {% csrf_token %} <div class="field has-addons"> <div class="control is-expanded"> {{ form.name }} </div> <div class="control"> <button type="submit" class="button is-info"> Add City </button> </div> </div> </form> </div> </div> </div> </section>
4.修改views.py,保存添加的城市。
最终的views.py代码如下:
import requests from django.shortcuts import render from .models import City from .forms import Cityform # Create your views here. def index(request): url = 'http://api.openweathermap.org/data/2.5/weather?q={}&appid=你的API' cities = City.objects.all() if request.method =='POST': form = Cityform(request.POST) form.save() form = Cityform() weather_data = [] for city in cities: r = requests.get(url.format(city)).json() city_weather = { 'city':city.name, 'temperature':r['main']['temp'], 'description':r['weather'][0]['description'], 'icon':r['weather'][0]['icon'], } weather_data.append(city_weather) content = {'weather_data':weather_data,'form':form} return render(request,'weather/weather.html',content)
这时就可以通过“add city”按钮添加城市了。
https://www.youtube.com/watch?v=qCQGV7F7CUc
十五、另一个天气app
https://www.youtube.com/watch?v=46VQvy1gp-4
为什么我五.4之后没有显示 纽约 天气温度那一块
看一下出错提示是什么。