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)