项目结构:

功能集合
-
主页显示用户的照片,姓名,github链接,点击访问,跳转到用户的github主页。
GHR(8LN~BJMN~_O9SQ3SKKO.png
-
输入github的用户名,点击搜索按钮。页面立即跳转到该用户的详情页。展示该用户的姓名,公司,博客地址,点击博客地址跳转到用户个人博客。
4$W@H3W22C~PPY@R7I}N4@D.png
-
主页点击查询按钮,页面跳转到用户列表页,展示所有搜索过的用户信息。
@{@1US(41`5AQ2_)```1)`W.png
Django是一个python开源框架。

MVC 模型
MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC 以一种插件式的、松耦合的方式连接在一起。
- 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
- 视图(V)- 图形界面,负责与用户的交互(页面)。
- 控制器(C)- 负责转发请求,对请求进行处理。
但是在Django中,是MTV模型,本质和MVC一致。只是名称不一致。
图解

用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数:
a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
b.如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回。
视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
开发环境
Win 10(64位)
Python 3.8.0
Django 3.1.7
编写Model.py
Django中通过模型(Model)映射到数据库,处理与数据相关的事务。
keithyang/models.py,输入如下代码:
python
from __future__ import unicode_literals
from django.db import models
# Create your models here.
查询列表信息 数据模型
class cal(models.Model):
value_a = models.CharField(max_length=10)
value_b = models.CharField(max_length=10)
result = models.CharField(max_length=10)
说明:每个模型(model)都被表示为 django.db.models.Model 类的子类,从它继承了操作数据库需要的所有方法。
数据迁移(Migrations)
每次models.py文件发生变化都需要执行2条指令
对模型的更改创建新的迁移表
python manage.py makemigrations
应用迁移到数据库中
python manage.py migrate
Views视图函数
Django 中视图即函数,path函数将url映射到视图
from django.shortcuts import render
import requests
import json
from .models import cal
# Create your views here.
def home(request):
api_request = requests.get("https://api.github.com/users?since=0")
api = json.loads(api_request.content)
return render(request, 'home.html', {"api": api})
def user(request):
# import requests
if request.method == 'POST':
user = request.POST['user']
user_request = requests.get("https://api.github.com/users/" + user)
user_name = json.loads(user_request.content)
name = user_name['name']
company = user_name['company']
follower = user_name['followers']
cal.objects.create(value_a=name, value_b=company, result=follower)
return render(request, 'user.html', {'user_name': user_name})
else:
return Calllist(request)
# def addinfo(request):
def Calllist(request):
data = cal.objects.all()
# for data in spldata:
# name = data.value_a
# location = data.value_b
# follows = data.result
return render(request, 'list.html', {'data': data} )
将url映射到视图
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
path('user/', views.user, name="user"),
path('list/', views.Calllist, name="list"),
]
Templates/base.html,home.html,user.html,list.html
Bootstrap中获取模板文件,编写home.html,user.html,list.html,
使用{% extends 'base.html'%}继承base.html文件。
{% block content %}
<!doctype html>
<html lang="zh-CN">
<head>
<!-- 必须的 meta 标签 -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap 的 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<title>Hub交友</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="{% url 'home' %}">Hub交友</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'user' %}">查询</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0" method="POST" action="{%url 'user'%}">
{% csrf_token %}
<input class="form-control mr-sm-2" type="search" name="user" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>
</form>
</div>
</nav>
<br/>
<div class="container">
{% block content %}
{% endblock %}
</div>
<!-- JavaScript 文件是可选的。从以下两种建议中选择一个即可! -->
<!-- 选项 1:jQuery 和 Bootstrap 集成包(集成了 Popper) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-LCPyFKQyML7mqtS+4XytolfqyqSlcbB3bvDuH9vX2sdQMxRonb/M3b9EmhCNNNrV" crossorigin="anonymous"></script>
<!-- 选项 2:Popper 和 Bootstrap 的 JS 插件各自独立 -->
<!--
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js" integrity="sha384-gRC4eoaRyQ8xv2X6Mnf+eOIrtON3wId3dAkwO0HQX26OrFBoLpjX/XWOJacSiZhL" crossorigin="anonymous"></script>
-->
</body>
</html>
网友评论