Django 3.0笔记(一)基础

1.hello,world

编写hello,world

使用pip安装Django。

使用pycharm创建新项目,命名为mysite。

在mysite文件夹内创建views.py作为视图层添加如下代码:

from django.http import HttpResponse
def index(request):
    return HttpResponse('hello,world')

在urls.py文件编写如下代码

from django.contrib import admin
from django.urls import path  # 还有一个re_path可以使用正则表达式
from . import views  # 引用同级文件


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index), # 表示可以通过网址/IP直接访问views.index
]

from . import XXX 表示从当前文件的路径(.)导入XXX,相对路径引用优先级高于绝对路径引用

然后使用命令行 py manage.py runserver 8000或者用pycharm的运行启动web服务,访问 127.0.0.1:8000就可以访问啦

为后台登录界面添加用户

用户信息存储在数据库中,所以要先通过命令行设置数据库再创建用户

数据库初始化:py manage.py migrate

创建管理员账号:py manage.py createsuperuser

如果manage.py的命令忘记了,可以使用py manage.py help来获取帮助

2.Django的基本应用结构

Django APP

使用 py manage.py startapp xxx创建应用(假设此处应用名是article)

会出现一个article的文件夹,在里面修改models.py文件

from django.db import models


# Create your models here.

# python的类使用类似于参数列表的形式表示继承,支持多继承
# Article类为了是一个模型类需要继承models.Model
class Article(models.Model):
    # 以下可以看成文章的属性
    title = models.CharField(max_length=30)  # 字符串类型的字段
    content = models.TextField()  # 可能很长的用文本字段

 

注册应用:在全局setting里面应用

在INSTALL_APPS里面加入article.apps.ArticleConfig 进行注册

同样在全局setting里面设置

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

可以使Django后台变成中文

更新模型后使用py manage.py makemigrations生成数据库迁移文件,使用py manage.py migrate执行数据操作

在article的admin.py注册后台管理页面

from django.contrib import admin
from .models import Article

admin.site.register(Article)

3.使用模板显示内容

视图层(views.py)查看文章页面与文章列表的返回

from django.shortcuts import render  # render可以把对象传给其它页面
from django.shortcuts import get_object_or_404  # 获取对象的简便方法
from django.http import Http404  # 创造404
from .models import Article  # 引用过来模型


# 模型的objects是获取或操作模型的对象
# Article.objects.get(条件)
# Article.objects.all()
# Article.objects.filter(条件)

# 一般麻烦的写法
# def article_detail(request, article_id):
#     try:
#         article = Article.objects.get(id=article_id)
#         '''
#         也可以写成 article = getobject_or_404(Article,pk = article_id)然后取消掉try_except结构
#         '''
#         context = {'article_obj': article}
#         return render(request, 'article_detail.html', context)
#     except Article.DoesNotExist:
#         raise Http404('页面走丢啦')  # 创造404
#         # 还可以这样写 return HttpResponse('页面不存在')

# 这个是获取文章详情
def article_detail(request, article_id):
    article = get_object_or_404(Article, pk=article_id)
    context = {
        'article_obj': article
    }
    return render(request, 'article_detail.html', context)


def article_list(request):
    articles = Article.objects.all()
    context = {
        'articles': articles
    }
    return render(request, 'article_list.html', context)

使用模板(templates)借助view.py返回的数据显示最终页面

注册路径

新建模板templates文件夹,并在全局setting里面进行注册路径

'DIRS': [os.path.join(BASE_DIR, 'templates')]

编写模板

article_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文章页面</title>
</head>
<body>
<h2>{{ article_obj.title }}</h2>
<hr>
<p>{{ article_obj.content }}</p>
</body>
</html>

article_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文章目录</title>
</head>
<body>
<h2>文章列表</h2>
{% for article in articles %}
{#    <a href="/article/{{ article.pk }}">{{ article.title }}</a><br>#}
    <a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a>
<br/>
{% endfor %}
</body>
</html>

路由表的关联

应用子路由 mysite-->article-->urls.py

(注意配置的别名,与模板对着看,靠名字跳转需要用)

from django.urls import path
from . import views

# 此时的路由主地址:local:8000/article/
urlpatterns = [
    path('<int:article_id>', views.article_detail, name='article_detail'),
    path('', views.article_list, name='article_list')
]

全局路由 mysite-->urls.py

"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path  # 还有一个re_path可以使用正则表达式
from . import views  # 引用同级文件
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('article/', include('article.urls')) # 包含子路由
]

4.后台定制

设置模型__str__

在models.py里面修改类可以使得模型相关信息显示在后台中

from django.db import models


# Create your models here.

# python的类使用类似于参数列表的形式表示继承
# Article类为了是一个模型类需要继承models.Model
class Article(models.Model):
    # 以下可以看成文章的属性
    title = models.CharField(max_length=30)  # 字符串类型的字段
    content = models.TextField()  # 可能很长的用文本字段

    # 修改这个函数可以修改后台界面的标题
    def __str__(self):
        return self.title

定制admin(在article-->admin.py里面)

from django.contrib import admin

from .models import Article


# 定制管理后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'content')  # 设置显示内容
    ordering = ('id',)  # 按照id升序,若写-id则会倒序
    # ordering = ('-id',) # 这样子写会按照id降序排列,默认也是降序的


# admin.site.register(Article, ArticleAdmin)  可以这样去注册
'''注册article的后台管理,第二个参数可以省略
可以使用
admin.site.register(Article, ArticleAdmin)  
也可以使用修饰器在类前面
@admin.register(Article)进行定制
'''

5.修改模型

修改模型需要更新数据库(需要设置默认值)

python manage.py makemigrations

python manage.py migrate

修改的代码如下:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


# python的类使用类似于参数列表的形式表示继承
# Article类为了是一个模型类需要继承models.Model
class Article(models.Model):
    # 以下可以看成文章的属性
    title = models.CharField(max_length=30)  # 字符串类型的字段
    content = models.TextField()  # 可能很长的用文本字段

    # 由于前期考虑不周,从这开始是新加的属性 新属性必须设置默认值
    created_time = models.DateTimeField(default=timezone.now)  # 设置创建时间
    '''
    因为时间的特殊性,时间的添加也可以用以下语句来进行
    created_time = models.DateTimeField(auto_now_add=True) 
    设置时间为新增时的时间。如果不是时间属性就乖乖的用default吧
    '''
    last_updated_time = models.DateTimeField(auto_now=True)
    '''
    这个auto_now = True 会使得按当前时间更新数据库
    '''
    author = models.ForeignKey(User, on_delete=models.DO_NOTHING, default=1)
    '''
    这一段用来添加用户,用户需要利用另一个模型进行外键关联。
    但是对于Django来说,用户模型有一个现成的可以直接用
    需要引用文件 django.contrib.auth.models import User
    使用外键进行关联,级联为models.DO_NOTHING 从表对主表无影响
    USER表里面的第一个就是自己,所以默认为1就成
    '''

    is_deleted = models.BooleanField(default=False)
    # 采用逻辑删除而非物理删除
    read_num = models.IntegerField(default=0)
    # 用来存放阅读数


# 修改这个函数可以修改后台界面的标题
def __str__(self):
    return self.title  # 这里设置返回文章的标题

新添加的字段不要忘了在admin.py里面进行修改

然后就是逻辑删除需要在视图里面进行修改过滤器

def article_list(request):
    # articles = Article.objects.all()  # 这个是获取全部文章的写法,原来的写法
    articles = Article.objects.filter(is_deleted=False)  # 获取没有被逻辑删除的目录
    context = {
        'articles': articles
    }
    return render(request, 'article_list.html', context)

 

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

10 − 2 =