Django基本操作

基本流程

  • 创建 Django 项目
    • 执行 python django-admin.py startproject <name>或者django-admin startproject <name> 命令,其中 <name> 是想创建的项目名称。
  • 创建 Django 应用
    • 执行 python manage.py startapp <appname> 命令,其中 <appname> 是想创建的应用名称。
    • 把应用名称添加到项目配置目录中的 settings.py 文件里,放到 INSTALLED_APPS 列表的末尾,告诉 Django 项目这个应用的存在。
    • 在项目的 urls.py 文件中添加一个映射,指向新建的应用。
    • 在应用的目录中新建 urls.py 文件,把入站 URL 与视图对应起来。
    • 在应用的 view.py 文件中编写所需的视图,确保视图返回一个 HttpResponse 对象。

模板

MVT模式

项目模板,/project/templates

TEMPLATE_DIR = os.path.join(BASE_DIR, 'templates')

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATE_DIR, ],
'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',
],
},
},
]
return render(request, 'rango/index.html', context=context_dict)

静态文件

STATIC_ROOT = "/code/helios/static"
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
{\% load staticfiles %}
<img src="{\% static "images/rango.jpg" %}"/> # static 标签会在images/rango.jpg 前加上 STATIC_URL 指定的 URL

媒体文件

MEDIA_DIR = os.path.join(BASE_DIR, 'media')
MEDIA_ROOT = MEDIA_DIR # 告诉 Django 在哪里寻找上传的媒体文件
MEDIA_URL = '/media/' # 指明通过什么 URL 伺服媒体文件

增加'django.template.context_processors.media'
urls.py增加static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

  • 首先,创建要使用的模板,保存到 templates 目录中(在项目的 settings.py 模块中设定)。模板中可以使用 Django 模板变量(例如 )或模板标签。模板变量的值在相应的视图中设定。
  • 在应用的 views.py 文件中找到所需的视图,或者新建一个。
  • 把视图相关的逻辑写在视图函数中。例如,从数据库中检索数据,存到列表中。
  • 在视图中构建一个字典,通过模板上下文传给模板引擎。
  • 使用 render() 辅助函数生成响应。这个函数的参数是请求对象、模板文件名和上下文字典。
  • 如果还没把视图映射到 URL 上,修改项目的 urls.py 文件和应用的 urls.py 文件。
  • 把想用的静态文件放到项目的 static 目录中。这个目录在项目的 settings.py 模块中的STATICFILES_DIRS 列表中设定。
  • 在模板中引用静态文件。例如,图像通过 标签插入 HTML 页面。
  • 记得在模板中加上 {\% load staticfiles %},然后使用 {\% static "<filename>" %} 标签引用静态文件。把 替换成图像或其他资源的路径。只要想引用静态文件,使用static 模板标签。

  • 把媒体文件放到项目的 media 目录中。这个目录由项目的 settings.py 模块中的 MEDIA_ROOT 变量设定。

  • 在模板中使用 上下文变量引用媒体文件。例如,引用上传的图像cat.jpg:<img src="cat.jpg" />

数据库

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 数据库路径
}
}

使用其他数据库引擎时,可以使用 USER、PASSWORD、HOST 和 PORT 等键配置。

# models.py
class Category(models.Model):
name = models.CharField(max_length=200, unique=True)

def __str__(self):
return self.name
class Meta:
verbose_name_plural = 'Categories'

class Page(models.Model):
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
title = models.CharField(max_length=200)
url = models.URLField()
views = models.IntegerField(default=0)

ForeignKey:用于建立一对多关系。
OneToOneField:用于建立一对一关系。
ManyToManyField:用于建立多对多关系。

$ python manage.py migrate

$ python manage.py createsuperuser

Django shell

$ python manage.py shell

>>> from appOne.models import Category
>>> Category.objects.all()


>>> c = Category(name="Test")
>>> c.save() # 再次列出所有分类对象
>>> print(Category.objects.all())
>>> a = Category.objects.all()
>>> print(a.query)
SELECT "appOne_category"."id", "appOne_category"."name" FROM "appOne_category"

打开 rango/admin.py 文件,注册想在管理界面显示的类。

# admin.py
from django.contrib import admin
from .models import Category, Page

# Register your models here.
admin.site.register(Category)
admin.site.register(Page)

测试数据生成脚本

import os 
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
'tango_with_django_project.settings')

import django
django.setup()
from rango.models import Category, Page

get_or_create() 方法返回一个元组 (object, created)

添加模型的过程可以分为以下 5 步。
➊ 首先在 Django 应用的 models.py 文件中定义模型。
➋ 更新 admin.py,注册新增的模型。
➌ 生成迁移:python manage.py makemigrations <app_name>。
➍ 运行迁移:python manage.py migrate。在数据库中创建模型所需的表和字段。
➎ 创建或编辑填充脚本。

➊ 如果 Django 开发服务器正在运行,停止。
➋ 如果使用的是 SQLite 数据库,删除 Django 项目根目录中的 db.sqlite3 文件。这个文件与manage.py 脚本位于同一级目录中。
➌ 如果修改过应用的模型,执行 python manage.py makemigrations <app_name> 命令,记得把<app_name> 替换成 Django 应用的名称(例如 rango。)如果未修改模型,跳过这一步。
➍ 执行 python manage.py migrate 命令,新建数据库文件(使用 SQLite 的话),并创建数据库表。
➎ 执行 python manage.py createsuperuser 命令,创建一个超级用户。
➏ 最后,运行填充脚本,在新数据库中插入可信的测试数据。

模型、模板和视图

在 Python 中,str() 和 unicode() 方法生成类的字符串表示形式(类似于 Java 中的toString() 方法)。在 Python 2.x 中,str() 方法以 ASCII 格式表示字符串;如果需要支持 Unicode,还要实现 unicode() 方法。
在 Python 3.x 中,字符串默认就支持 Unicode,因此只需实现 str() 方法。

发现没有,管理界面中有拼写错误(应该是 Categories,而不是 Categorys)?为了修正这个错误,可以在模型定义中添加嵌套的 Meta 类,在里面声明 verbose_name_plural 属性。下面是修改后的 Category 模型。Meta 类有很多作用,详情参见 Django 文档。