python manage.py startapp app_name
python manage.py makemigrations
python manage.py migrate
python manage.py flush
python manage.py runserver
python manage.py runserver 8001
python manage.py runserver 0.0.0.0:8000
python manage.py shell
startapp 用于新建一个app
makemigrations 命令用于查找所有可用的 models,为任意一个在数据库中不存在对应数据表model创建migration脚本文件。
migrate 命令用于运行这些 migrations 自动创建数据库表。
flush 会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表
Django 自身包含了 orm 框架,可以使用其强大的 数据-模型语句来描述数据模型。
#mysite/news/models.py
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextFiled()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
#import the models we created from our "news" app
from new.models import Article, Reporter
from datetime import date
#no reporters are in the system yet
Reporter.objects.all()
#<QuerySet []>
#create a new Reporter
r = Reporter(fill_name='John Smith')
#save the object into the database.
r.save()
#now r has an id
r.id
#1
#now the new reporter is in the database
Reporter.objects.all()
#<QuerySet [<Reporter: John Smith>]
#fields are represented as attributes on the Python object
r.full_name
#'John Smith'
#django provides a rich database lookup API
Reporter.objects.get(id=1)
#<Reporter: John Smith>
Reporter.objects.get(full_name_startwith='John')
#<Reporter: John Smith>
Reporter.objects.get(full_name_contains='mith')
#<Reporter: John Smith>
#create an article
a = Article(pub_date=date.today(), headline='Django is cool',
content='Yeah.', reporter=r)
a.save()
#Article objects get API access to related Reporter objects
r = a.reporter
r.full_name
#Reporter objects get API access to Article objects
r.article_set.all()
#<Queryset [<Article: Django is cool>]>
#This finds all articles by a reporter whose name start with "John"
Article.objects.filter(reporter_full_name_startwith='John')
#<Queryset [<Article: Django is cool>]>
#change an object by altering its attributes and calling save()
r.full_name='Billy Goat'
r.save()
#delete an object with delete()
r.delete()
当你的模型完成定义,Django 就会自动生成一个专业的生产级 管理接口 -- 一个允许认证用户添加、更改和删除对象的web站点。只需要简单的在 admin 站点上注册模型即可。
#mysite/news/admin.py
from django.contrib import admin
from . import models
admin.site.register(models.Article)
创建一个叫做 URLconf 的 python 模块,这就是网站的目录,包含了一张 URL 和 Python 回调函数之间的映射表。URLconf 也有利于将 Python 代码与 URL 进行解耦。
#mysite/news/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<int:pk>/, views.article_detail),
]
上述代码将 URL 路径映射到了 Python 回调函数(视图)。路径字符串使用参数标签从 URL 中捕获相应值。当用户请求页面时,Django 依次遍历路径,直到初次匹配到了请求的 URL。如果无匹配项,Django 会调用 404 视图。这个过程很快,因为路径在加载时就编译成了正则表达式。
一旦有 URL 路径匹配成功,Django 会调用相应的视图函数。每个视图函数会接受一个请求对象--包含请求元信息以及 URL 路径中包含的参数值。
视图函数的执行结果有两种:返回一个包含请求页面元素的 HttpResponse 对象,或是抛出 Http404 类异常。
#mysite/news/views.py
from django.shortcuts import render
from .models import Article
def year_archive(request, year):
a_list = Article.objects.filter(pub_date_year=year)
context = {'year':year, 'article_list':a_list}
return render(request, 'news/year_archive.html', context)
Django 允许设置搜索模板路径,以最小化模板之间的冗余。Django 通过 DIRS 参数指定一个路径列表用于搜索模板。如果第一个路径中不包含任何模板,继续检查第二个。
#mysite/news/templates/news/year_archive.html
{% extends "base.html" %}
{% block title %}Articles for{{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
<% endfor %>
<% endblock %>
我们看到变量都被双大括号括起来了。 {{ article.headline }} 的意思是“输出 article 的 headline 属性值”。这个“点”还有更多的用途,比如查找字典键值、查找索引和函数调用。
我们注意到 {{ article.pub_date|date: "F j, Y" }} 使用了 Unix 风格的“管道符”(“|”字符)。这是一个模板过滤器,用过滤变量值。在这里过滤器将一个 Python datetime 对象转化为指定的格式(就像 PHP 中的日期函数那样)。
你可以将多个过滤器连在一起使用。你还可以使用你自定义的模板顾虑器。你甚至可以自己编写自定义的模板标签 ,相关的 Python 代码会在使用标签时在后台运行。
Django 使用了 ''模板继承'' 的概念。这就是 {{ % extends "base.html" %}} 的作用。它的含义是''先加载名为 base 的模板,并且用下面的标记块对模板中定义的标记块进行填充''。简而言之,模板继承可以使模板间的冗余内容最小化:每个模板只需包含与其它文档有区别的内容。
下面的 base.html 使用了静态文件
#mysite/templates/base.html
{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static "images/sitelogo.png" %}" alt="Logo">
{% block content %}{% endblock %}
</body>
</html>