从头开始慢慢写了,更新可能会略微慢点,这里借鉴一个前辈的博客做的,加上了自己遇到的各种小问题,自己的理解
配置环境 python3.7版本
下载python什么的就不写了
创建一个Django项目,本来用的是pycharm,后来一想,pycharm各种版本,配置问题
算了还是写命令行的吧,命令行才是通用,文章没有多余的废话,所以不要只看代码,防止漏过什么东西
新建一个文件夹>进入文件夹目录>创建虚拟环境>进入虚拟环境
mkdir django_ver cd django_ver python -m venv env env\Scripts\activate.bat
显示(env)表示进入虚拟环境成功
然后下载Django,我用的版本是2.2.5的
pip install django==2.2.5
在与虚拟环境同级目录创建Django项目,也就是在django_ver文件夹下
django-admin startproject my_blog
这个时候简单的Django就可以运行起来了,进入my_blog目录下
cd my_blog
python manage.py runserver
浏览器输入 http://127.0.0.1:8000/ 看到小火箭就OK了
继续下一步,使用Cril+C终止Django运行
回到my_blog目录下,创建第一个APP
python manage.py startapp article
接下来紧跟着注册APP,在setting中 INSTALLED_APPS 里添加 \'article\', 一般是第39行,
INSTALLED_APPS = [ \'django.contrib.admin\', \'django.contrib.auth\', \'django.contrib.contenttypes\', \'django.contrib.sessions\', \'django.contrib.messages\', \'django.contrib.staticfiles\', \'article\', ]
然后进入 my_blog 下的 urls.py 下,添加路由,先导入 include
from django.contrib import admin from django.urls import path, include # 存放映射关系的列表 urlpatterns = [ path(\'admin/\', admin.site.urls), path(\'article/\', include(\'article.urls\', namespace=\'article\')), ]
在acticle下新建 urls.py 文件 ,配置路径就差不多了
from django.urls import path # 正在部署应用的名称 app_name = \'article\' urlpatterns = [ ]
接下来去创建模型,打开article下的models.py
import用于导入整个功能模块。但实际使用时往往只需要用模块中的某一个功能,为此导入整个模块有点大材小用,因此可以用from a import b表示从模块a中导入b给我用就可以了。
from django.db import models # 导入内建的User模型。 from django.contrib.auth.models import User # timezone 用于处理时间相关事务。 from django.utils import timezone # 博客文章数据模型 class ArticlePost(models.Model): # 文章作者。参数 on_delete 用于指定数据删除的方式 author = models.ForeignKey(User, on_delete=models.CASCADE) # 文章标题。models.CharField 为字符串字段,用于保存较短的字符串,比如标题 title = models.CharField(max_length=100) # 文章正文。保存大量文本使用 TextField body = models.TextField() # 文章创建时间。参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间 created = models.DateTimeField(default=timezone.now) # 文章更新时间。参数 auto_now=True 指定每次数据更新时自动写入当前时间 updated = models.DateTimeField(auto_now=True) # 内部类 class Meta 用于给 model 定义元数据 class Meta: # ordering 指定模型返回的数据的排列顺序 # \'-created\' 表明数据应该以倒序排列 ordering = (\'-created\',) # 函数 __str__ 定义当调用对象的 str() 方法时的返回值内容 def __str__(self): # return self.title 将文章标题返回 return self.title
接下来进行数据库同步,迁移,在my_blog目录下(注意是虚拟环境)
python manage.py makemigrations
#通过运行makemigrations命令,Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移
Migrations for \'article\': article\migrations\0001_initial.py - Create model ArticlePost
显示这样就是成功了,进行下一步
python manage.py migrate
#迁移到数据库
创建超级管理员,进入后台,Django自带的admin管理后台
python manage.py createsuperuser
会提示输入账号邮箱密码,邮箱可以不填,密码会隐藏,是看不到的,通常这个环节就是admin admin admin y
打开article下的admin.py,将 articlepost 注册到后台,就是数据表
from django.contrib import admin # 别忘了导入ArticlerPost from .models import ArticlePost # 注册ArticlePost到admin中 admin.site.register(ArticlePost)
运行Django项目python manage.py runserver (注意环境,路径,是在虚拟环境下,my_blog下运行),输入 http://127.0.0.1:8000/admin/ 输入账号密码,进入后台
找到articlepost 进入添加信息,选择作者,填写标题和内容,右下角保存,可以多添加几条
接下来写视图喽,打开article下的views.py
from .models import ArticlePost def article_list(request): # 取出所有博客文章 articles = ArticlePost.objects.all() # 需要传递给模板(templates)的对象 context = { \'articles\': articles } # render函数:载入模板,并返回context对象 return render(request, \'article/list.html\', context)
然后在my_blog目录下创建 template 文件夹 再在template 文件夹下创建article文件夹 在article文件夹下创建 list.html 文件 ,写入如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for article in articles %} <p>{{ article.title }}</p> {% endfor %} </body> </html>
-
{% for article in articles %}:articles为视图函数的context传递过来的上下文,即所有文章的集合。{% for %}循坏表示依次取出articles中的元素,命名为article,并分别执行接下来操作。末尾用{% endfor %}告诉Django循环结束的位置。 -
使用
.符号来访问变量的属性。这里的article为模型中的某一条文章;我们在前面的ArticlePost中定义了文章的标题叫title,因此这里可以用article.title来访问文章的标题。 -
<p>...</p>即为html语言,中间包裹了一个段落的文字
再去setting.py文件下,在大概64行的位置 ,插入
\'DIRS\': [os.path.join(BASE_DIR, \'templates\')],指定路径在根目录下的templates
TEMPLATES = [ { \'BACKEND\': \'django.template.backends.django.DjangoTemplates\', \'DIRS\': [os.path.join(BASE_DIR, \'templates\')], \'APP_DIRS\': True, \'OPTIONS\': { \'context_processors\': [ \'django.template.context_processors.debug\', \'django.template.context_processors.request\', \'django.contrib.auth.context_processors.auth\', \'django.contrib.messages.context_processors.messages\', ], }, }, ]
然后启动服务器,浏览器打开 http://127.0.0.1:8000/article/article-list/
这个时候可能会有一个编码问题,一般不会有,某种不可告人的情况下可能会出现
UnicodeDecodeError: \'gbk\' codec can\'t decode byte 0xa6 in position 9737: illegal multibyte sequence,
解决办法是打开django/views/下面的debug.py文件,也可以根据pycharm的报错信息的点击打开这个文件,在第331行的open()中,加上 encoding="utf-8"
这个时候目录差不多就是这样的,出问题了看看是不是路径的问题
后面正在写,晚点更新
提前在这里记录一个小坑 图片加载不出来时候看看路径,或许是多了一个斜杠呢。。。
SuspiciousFileOperation 异常 MEDIA_ROOT = os.path.join(BASE_DIR, \'media/\') 改为 MEDIA_ROOT = os.path.join(BASE_DIR, \'media\')
先放出最后的效果图吧,还没修改html模板,不是很美观,中间的代码正在组织编写,遇到的各种小问题也都会写出来