wlnwyy

从头开始慢慢写了,更新可能会略微慢点,这里借鉴一个前辈的博客做的,加上了自己遇到的各种小问题,自己的理解

配置环境   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模板,不是很美观,中间的代码正在组织编写,遇到的各种小问题也都会写出来

 

分类:

技术点:

相关文章: