一.制作一个Web应用程序的流程
1.建立虚拟环境。 python -m venv xxx
2.激活虚拟环境。 xxx\Scripts\activate
3.安装Django。 pip install django
4.在Django中创建项目。 django-admin startproject xxx . (这个项目是可交互的,前后端数据交互)
5.创建数据库。 python manage.py migate
6.创建应用程序。 (创建模型,激活模型)
7.Django管理网站。(创建超级用户,向管理网站注册模型)
此时可以用Django shell 来检查前面的模型是否都添加成功。
8.创建页面。(映射URL,编写视图,编写模板)
9.让用户输入数据。
10.创建用户账户。
11.将用户和自己的数据关联。
此时一个可以在本地浏览器上运行且功能完善的应用程序已经基本完成。
12.将此应用程序的样式设计完成。
13.将应用程序部署到Heroku。
此时的应用程序不仅功能完善且样式精美,而且还可以让如何有互联网的人都接入。
二.Django,Bootstrap4
Django:Python Web 框架。可以实现前端和后端的数据连接,用于自动创建网页。
Bootstrap4:前端框架。基于HTML、CSS、JS,用于为Web应用程序设置样式。
三.各个文件夹与文件的作用
第4步中在Django中创建项目时,项目总文件夹learning_log中出现了三个主要文件:
- leaning_log:项目总文件夹,目录
- ll_env:虚拟环境目录
- manage.py:接受指令并交给django运行的一个程序。
而在项目总文件夹learning_log下的learning_log目录中同时也出现了四个主要文件夹:
- init.py:初始化文件
- setting.py:指定Django如何与系统交互,如何管理项目
- urls.py:告诉Django应该创建哪些页面来响应浏览器请求
- wsgi:帮助Django提供他创建的文件
第6步中创建应用程序时,创建的应用程序learning_logs中出现了三个只要文件:
- models.py:用来定义要在应用程序中管理的数据,编写各个在应用程序中所需要的模型
- views.py:用于接受请求中的信息准备好生成页面所需的数据,再将这些数据发送给浏览器
- admin.py:用于注册再models.py中定义好的模型,models.py中定义的所有模型都需要在admiin.py中用admin.site.register(xxx)来注册
四.创建页面时的数据流向
1.项目根目录learning_log中的urls.py文件中:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('users/',include('users.urls')),
path('',include('learning_logs.urls')),
]
第一个路径:模块admin.site.urls中定义了可在管理网站中请求的所有URL,当浏览器中的url与‘admin/’匹配时,可以连接到管理网站中所有的url。所以注册的超级用户可以链接到全部
url。
第二个路径:当浏览器请求的url与‘users/’匹配时,可以连接到与普通用户有关的登录,注册,注销等的所有url。
第三个路径: 当浏览器请求的url与‘users/’匹配时,可以连接到登录后的learning_log中的所有url。
然后在learning_log中的所有路径和在users中的所有路径,在于浏览器请求匹配后,就调用视图文件中的函数,并且为此URL模式指定特定名字,便于以后调用。
2.在应用程序learning_logs文件夹中的view.py中
from django.shortcuts import render,redirect,get_object_or_404
from .models import Topic,Entry
from .forms import TopicForm,EntryForm
from django.contrib.auth.decorators import login_required
from django.http import Http404
def index(request):
return render(request,'learning_logs/index.html')
@login_required
def topics(request):
topics = Topic.objects.filter(owner = request.user).order_by('date_added')
context = {'topics':topics}
return render(request,'learning_logs/topics.html',context)
@login_required
def topic(request,topic_id):
topic = get_object_or_404(Topic,id = topic_id)
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
context = {'topic':topic,'entries':entries}
return render(request,'learning_logs/topic.html',context)
@login_required
def new_topic(request):
if request.method != 'POST':
form = TopicForm()
else:
form = TopicForm(data = request.POST)
if form.is_valid():
new_topic = form.save(commit = False)
new_topic.owner = request.user
new_topic.save()
return redirect('learning_logs:topics')
context = {'form':form}
return render(request,'learning_logs/new_topic.html',context)
@login_required
def new_entry(request,topic_id):
topic = Topic.objects.get(id = topic_id)
if request.method != 'POST':
form = EntryForm()
else:
form = EntryForm(data=request.POST)
if form.is_valid():
new_entry = form.save(commit = False)
new_entry.topic = topic
new_entry.save()
return redirect('learning_logs:topic',topic_id = topic_id)
context = {'topic':topic,'form':form}
return render(request,'learning_logs/new_entry.html',context)
@login_required
def edit_entry(request,entry_id):
entry = Entry.objects.get(id = entry_id)
topic = entry.topic
if topic.owner != request.user:
raise Http404
if request.method != 'POST':
form = EntryForm(instance = entry)
else:
form = EntryForm(instance=entry,data=request.POST)
if form.is_valid():
form.save()
return redirect('learning_logs:topic',topic_id = topic.id)
context = {'entry':entry,'topic':topic,'form':form}
return render(request,'learning_logs/edit_entry.html',context)在这
在调用view.py中的各个函数时,view.py中将会调用各个HTML的模板页面,来实现各个功能与页面的显示。