创建项目及应用:
django-admin startproject project_name
cd project
python manage.py startapp app_name
在app目录中创建urls.py文件
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("polls/", include("polls.urls")),#将新创建的app URL添加进来
path("admin/", admin.site.urls),
]
在项目目录 settings.py中设置:
INSTALLED_APPS = [
'polls.apps.PollsConfig',# 这里需要添加,在app.py中
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#数据库修改为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sakila',
'USER': 'root',
'PASSWORD': '......',
'HOST': 'localhost',
'PORT': '3306',
}
}
下面这一部分在后文使用mysql数据库有详细说明
python manage.py inspectdb
python manage.py inspectdb > models.py #重定向保存为文件(可参考使用)
将其粘贴到应用目录下的models.py中
仅读取数据不要使用migrate命令进行迁移!
此命令会尝试在数据库中创建新的表,如果只读取数据不要进行此操作!
不允许对数据库进行修改操作也就不能使用后台管理
可以通过使用多数据库引擎来解决这个问题
创建项目后的目录结构
用startproject命令创建mysite项目,然后用startapps命令创建了polls应用,一个项目可以包含多个应用,每个应用都是“可插拔”式的,目前的目录结构:
使用SQLite数据库建表
官方教程
mysite的setting文件中设置数据库引擎
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
TIME_ZONE 与 INSTALLED_APPS 字段可以默认,根据需要设置
使用migrate命令根据配置创建(迁移)数据文件
python manage.py migrate
定义模型
模型的概念对应到代码中是一个类,是django.db.models.Model 类的子类,对应到数据库中是一个表,类中的变量是数据库表中的列,每个类生成的对象即对应表中一条数据
下面是在polls/models.py中的模型代码
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
激活模型
polls应用是可插拔的,需要在项目中激活。
pollsConfig类写在polls/apps.py文件中,所以它的点式路径为‘polls.apps.PollsConfig’
在mysite/settings.py中的INSTALLED_APPS字段添加点式路径
INSTALLED_APPS = [
"polls.apps.PollsConfig",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
用下面命令检测对于模型文件修改,并把修改部分存储为一次迁移
python manage.py makemigrations polls
#下面的0001是上个命令产生的迁移的名称,该指令会展示迁移对应的SQL命令
python manage.py sqlmigrate polls 0001
#sqlmigrate并不会执行SQL命令,使用migrate执行
python manage.py migrate
migrate选中所有还未执行过的迁移并且应用在数据库上
改变模型三步:
编辑models.py文件,改变模型
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移
创建管理员账号
python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********
Superuser created successfully.
python manage.py runserver# 启动服务器
网页即可进入管理界面http://127.0.0.1:8000/admin/
向管理界面加入投票应用
在polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
# Register your models here.
设置MySQL数据库的方法
需要下载mysqlclient
pip install mysqlclient
Django官方手册
连接已有数据库
首先在setting.py中配置DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_name',
'USER': 'your_user',
'PASSWORD': 'your_password',
'HOST': 'localhost',
'PORT': '3306',
}
}
使用命令inspectdb审查现有数据库来创建的模型,可将生成的代码根据需要粘贴到相应model文件中
python manage.py inspectdb
python manage.py inspectdb > models.py #重定向保存为文件(可参考使用)
默认情况下inspectdb创建未托管的表,也就是Django不被允许对表进行修改、删除等管理操作,这一点对于只读取数据的系统来说非常关键,通过生成的Meta类的managed 字段设置
class Person(models.Model):
id = models.IntegerField(primary_key=True)
first_name = models.CharField(max_length=70)
class Meta:
managed = False #这里设置为False拒绝Django管理
db_table = "CENSUS_PERSONS"
仅读取数据不要使用migrate命令进行迁移!
此命令会尝试在数据库中创建新的表,如果只读取数据不要进行此操作!
然后在admin.py中添加相应表单即可在管理页面查看数据
生成的model代码默认显示如下,仅显示Address object(xxx)
在类中添加如下代码
即可变成下面的显示内容
官方教程第三部分 创建视图
教程链接
在polls/views.py中创建视图,每个函数代表一个页面,然后将其注册到urls.py中
在这一步中我们可以完成任何我们想做的事情,比如读取数据库中的数据进行处理完成可视化。Django需要的只是返回一个HttpResponse ,或者抛出一个异常。
- 在view.py中添加视图函数
- 在urls.py中添加url来设置网址
可以添加模版,这样不需要每次更改view.py中的代码来更改视图
render(),get_object_or_404()
render()作用:载入模板,填充上下文,再返回由它生成的 HttpResponse 对象
get_object_or_404():获取对象,或者抛出404错误
from django.shortcuts import render, get_object_or_404
def actor_detail(request, actor_id):
acotr = get_object_or_404(Actor, pk = actor_id)
return render(request, "polls/actor/detail.html", {"actor": Actor})
去除模版中的url硬编码
使用 {% url %} 模板标签来消除对 url 配置中定义的特定 URL 路径的依赖:
{% if latest_actor_list %}
<ul>
{% for actor in latest_actor_list %}
<li><a href="{% url 'actor_detail' actor.actor_id%}">{{ actor.first_name}}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}