- 1 新建项目,勾选django框架
自动生成的那个项目是主项目,而我们要做自己的项目。所以要生成自己的子项目,idea的terminal中输入:
python manage.py startapp 项目名字 #初始化自己的项目(例如我的file就是子项目)
terminal位置
然后在settings.py
中配置子项目
INSTALLED_APPS 添加自己新建的项目名
- 2 现在可以写连接数据库的一系列配置,也可以写html文件。这里我们就先把html网页画好,然后再连接数据库。
html文件放在templates
目录下;如果有图片,则需要建一个static
目录来放它(注意:static与templates是同级目录)
并且在settings.py中写入配置
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]
- 3 接下来做数据库的配置了(数据库的创建,python连接数据库的配置等)
使用django框架是不需要写数据库表的,而是由框架生成,所以只需要建好数据库就行
记得先开启mysql服务
win+s搜索cmd,右键管理员运行,输入net start mysql
·建数据库的方式就多了去了(cmd,idea工具,navicat等),随便选一个就行
show databases;
create database djangotest default character set utf8;
· 修改settings.py
中数据库连接的配置(默认是sqlite3)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangotest', #数据库名
'USER': 'root',
'PASSWORD': '1234',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
- 4 通过django框架生成数据库表
在models.py
中写数据库模型,注意写外键的方式,这也决定了uid保存的是一个对象,而不是主键id值
,这也导致了后面拿id值很容易出错!
from django.db import models
# Create your models here.
#
class Userinfo(models.Model):
email=models.CharField(max_length=50,unique=True)
password=models.CharField(max_length=50)
nickname=models.CharField(max_length=50)
mobile=models.CharField(max_length=32,unique=True)
birthday=models.DateField()
createtime=models.DateTimeField(auto_now_add=True)
class MessageInfo(models.Model):
message=models.CharField(max_length=2000)
score=models.DecimalField(max_digits=19,decimal_places=2,default=2)
messagetime=models.DateTimeField(auto_now_add=True)
useful=models.IntegerField(default=0)
useless=models.IntegerField(default=0)
uid=models.ForeignKey('Userinfo',on_delete=models.CASCADE)
#on_delete=models.CASCADE保证了主键数据被清除时,外键的相关数据也会被清除。避免了垃圾数据的产生
在idea的terminal中输入
python manage.py makemigrations #自动化生成迁移文件
python manage.py migrate #自动化生成数据库表
这样数据库表就自动建好了
数据库表数据库表字段(数据是后来添加进去的)
如果第二条命令出错,那么可能是最新版本django不支持旧mysql的问题,对django降级后就ok了。terminal输入
pip install django==2.0.0 -i https://pypi.douban.com/simple
- 5 到这里为止网页已经写好了,存网页数据的数据库也搞定了。下面就需要做网页的相关跳转以及功能了
我们知道打开网页都是通过url来打开的,所以需要配好网页的url(然而子项目没有urls.py这个文件,所以要自己手动创建。)。由于file是我们的子项目,所以需要在主项目的urls.py
中指定使用子项目的urls.py
在主项目的urls.py最后添加
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('file/',include('file.urls'))
]
- 6 现在来配置首页(先定个小目标:做出个首页压压惊)
在子项目的urls.py中
添加(配置url地址,并调用 views.py对这个url请求进行处理)
from django.urls import path
from . import views
urlpatterns=[
path('index/',views.index)
]
配置views.py
,对url请求进行处理。(这里就是当输入http://127.0.0.1:8000/file/index/这个地址请求时,就返回一个渲染的index.html网页)
from django.shortcuts import render,redirect
def index(request):
return render(request,'index.html')
好了,我们运行这个项目之后,首页就可以通过地址来访问了
-
7 如果需要配置局域网内访问:(可选)
然后在setting.py
配置ALLOWED_HOSTS = ['*']
在idea的terminal中输入:
python manage.py runserver 0.0.0.0:8000
- 8 接下来做网页的跳转
如何实现网页的跳转呢?我们是不是需要点击啥,然后给服务器发送一个请求?目前知道的给网页发送请求的方式有两种:- a标签的网页链接
- button标签的submit(提交)属性
所以点击的要么是a标签,要么是一个button标签
下面就来做登录页面的跳转(通过a标签来做。ps:名字取错了)
子项目urls.py中配置链接需要调用的方法,来对请求进行处理
对请求进行处理:渲染注册页面
点击登录之后就可以跳转这个页面了
- 9 下面要做的是填写登录信息,并登录跳转回首页。想想都麻烦:需要将网页上填写的数据发送给服务器;然后需要从数据库里拿数据与填写的数据进行对比,看是不是正确的;如果正确就跳转主页,不正确就刷新页面并需要重新填写。(写了一上午,饿。。。。等外卖中)
首先是将网页的数据提交给数据库,前面已经用过a标签发送请求的方法了,下面就用button来发送请求。
button又没有a标签那样的链接怎么发送请求给服务器来提交数据呢?其实是通过表单的链接来提交数据的,所以先配置html网页的form表单
<body>
<form action="" method="">
{% csrf_token %} #添加保护机制代码
</form>
</body>
mthod的传值方式分为post(隐式)和get(显式)
action后面是一个链接(必须有最后斜线),通过配置子项目urls.py地址请求views.py处理
signin.html 子项目urls.py
对请求的处理方法
-
10 写了半天,总算写完了这一步了。当信息都填写正确后,就又回到首页了,但是这次回到首页是带着登录用户身份的。
带着牌子的
至于说这个是怎么拿到的,就是上面的session存的email值啊。
- 11 现在来写评论了(想吐槽不?)----如何把网页的数据存到数据库里?
看见session了没,真的挺有用的。这里就需要判断是不是用户登录了,没登陆是发布了评论的。点发布评论之后就跳转评论页面了,一样的套路就不啰嗦了。(a标签写一个链接,urls给链接指定使用那个方法,方法做出处理)
吐槽现场
当评论写完后,点击发表评论,就发送一个请求。通过form标签给出响应地址,这个地址通过urls.py的配置,指定使用views.py中的发表评论方法。
怎么存数据到数据库里?这里有很重要的知识点了
-
12 发表评论后,首页应该把评论都显示出来。可是怎么刷出所有评论?或者说首页一加载就要刷出所有信息。可以在index方法中获取所有数据,然后将数据传给首页。都是前面说过的知识点了
html中for循环的写法
刷出所有评论
- 13 后面还有一个点赞有用和没有用的功能。包含了问号传参与更新数据库的写法
从网页获取数据的方式:- 通过input标签的name属性来传值 post或者get都可以
post=request.POST
var=post.get('name值') -
如果不是input标签的就可以用问号传参的方式了 这个获取数据就只能用get来得到
在html需要传值的后面添加 ?变量名称
get=request.GET
get.get('问号后面的变量名称')
问号传参
- 通过input标签的name属性来传值 post或者get都可以
def useful(request):
get=request.GET #问号传参用get取值
uid=get.get('uid')
msg=MessageInfo.objects.filter(id=uid)
point=msg[0].useful
point+=1
msg.update(useful=point)
return redirect('/file/index')
越写越不想写,因为知识点实在是太分散了,不通过整个网页的制作流程来说的话就太乱了。好了,到这里所有知识点都包含进去了。
网友评论