Design your model
虽然您可以使用没有数据库的Django,但它附带一个 对象关系映射器,您可以在其中以Python代码描述数据库布局。
该数据模型语法提供代表你的模型的许多丰富的方式-迄今为止,它已经解决了多年的价值的数据库架构的问题。以下是一个简单的例子:
mysite/news/models.py
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self): # __unicode__ on Python 2
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self): # __unicode__ on Python 2
return self.headline
Install it
接下来,运行Django命令行实用程序自动创建数据库表:
$ python manage.py migrate
该migrate命令查看所有可用的模型,并在数据库中创建不存在的表以及可选地提供更丰富的模式控制的表。
Enjoy the free API
因此,您有一个免费且丰富的Python API 来访问您的数据。该API即时创建,无需代码生成:
# Import the models we created from our "news" app
# 导入我们编写的数据模型
>>> from news.models import Reporter, Article
# No reporters are in the system yet.
# 返回数据库对象的QureySet[]
>>> Reporter.objects.all()
<QuerySet []>
# Create a new Reporter.
# 创建Reporter的实例
>>> r = Reporter(full_name='John Smith')
# Save the object into the database. You have to call
# save() explicitly.
>>> r.save()
# Now it has an ID.
# 这个是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是指向John Smith这个对象的
>>> 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__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist.
# Create an article.
>>> from datetime import date
# 创建Article的实例
>>> a = Article(pub_date=date.today(), headline='Django is cool', content='Yeah.', reporter=r)
# 保存到数据库
>>> a.save()
# Now the article is in the database.
# 返回Article的数据库对象
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>
# Article objects get API access to related Reporter
# objects.
# 通过Article对象可以访问Reporter对象的属性
>>> r = a.reporter
>>> r.full_name
'John Smith'
# And vice versa: Reporter objects get API access to
# Article objects.
# 当然也可以通过Reporter可以访问Article的API
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>
# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
# 这时一个过滤器,过滤关键字'full_name'字段的值
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
# Change an object by altering its attributes and calling save().
# 更改对象的属性'full_name'
>>> r.full_name = 'Billy Goat'
>>> r.save()
# Delete an object with delete().
# 删除对象r
>>> r.delete()
A dynamic admin interface: it’s not just scaffolding – it’s the whole house
一旦您的模型被定义,Django就可以自动创建一个专业的,生产就绪的管理界面 - 一个允许经过身份验证的用户添加,更改和删除对象的网站。在管理员网站上注册您的模型非常简单:
mysite/news/models.py
from django.db import modclass Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
mysite/news/admin.py
from django.contrib import admin
from . import models
admin.site.register(models.Article)
这里的理念是,您的网站由员工或客户端编辑,也可能仅仅是您编辑 - 而您不需要处理创建后端接口来管理内容。
创建Django应用程序的一个典型工作流程是创建模型并尽可能快地获取管理站点的运行,因此您的员工(或客户端)可以开始填充数据。然后,开发数据呈现给公众的方式。
Write your views
每个视图都负责执行以下两项操作之一:
返回包含HttpResponse所请求页面的内容的 对象,
或引发诸如此类的异常Http404。其余的取决于你。
通常,视图view根据参数检索数据,加载模板module并使用检索到的数据呈现模板。以下是year_archive上面的示例视图 :
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)
设计你的模板
上面的代码加载了news/year_archive.html模板。
Django有一个模板搜索路径,它允许您最大限度地减少模板之间的冗余。在您的Django设置中,您可以指定要检查模板的目录列表DIRS。如果第一个目录中不存在模板,则会检查第二个目录,依此类推。
假设news/year_archive.html模板被发现。这可能是这样的:
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 }}意思是“输出文章标题属性的值”,但是点不仅仅用于属性查找。他们还可以进行字典键查找,索引查找和函数调用。
注意使用Unix风格的“管道”(“|”字符)。这被称为模板过滤器,它是一种过滤变量值的方法。在这种情况下,日期过滤器会以给定的格式(在PHP的日期函数中找到)格式化Python datetime对象。{{ article.pub_date|date:”F j, Y” }}
您可以将所需的过滤器连接在一起。您可以编写自定义模板过滤器。您可以编写 自定义模板标签,该标签在幕后运行自定义Python代码。
最后,Django使用“模板继承”的概念。那就是 这样。这意味着“首先加载名为”base“的模板,它定义了一堆块,并使用以下块填充块。”简而言之,这样可以大大减少模板中的冗余:每个模板只能定义该模板的独特之处在于{% extends “base.html” %}
以下是“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>`这里写代码片
简单来说,它定义了网站的外观(与网站的标志),并为子模板填写提供了“洞”。这使得站点重新设计与更改单个文件(基本模板)一样简单。
它还允许您创建多个版本的站点,具有不同的基本模板,同时重用子模板。Django的创作者已经使用这种技术创建了非常不同的移动版本的网站 - 只需创建一个新的基本模板。
请注意,如果您喜欢其他系统,则不必使用Django的模板系统。Django的模板系统与Django的模型层特别完美地结合在一起,但是没有什么会强制你使用它。对于这一点,您也不必使用Django的数据库API。您可以使用另一个数据库抽象层,您可以读取XML文件,您可以从磁盘读取文件,或任何您想要的内容。每个Django - 模型,视图,模板 - 与下一个解耦。