**外层的mysite/根目录仅仅是项目的一个容器。它的命名对Django无关紧要;你可以把它重新命名为任何你喜欢的名字。
manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互。 你可以在django-admin和manage.py中读到关于manage.py的所有细节。
内层的mysite/目录是你的项目的真正的Python包。它是你导入任何东西时将需要使用的Python包的名字(例如 mysite.urls)。
mysite/init.py:一个空文件,它告诉Python这个目录应该被看做一个Python包。 (如果你是一个Python初学者,关于包的更多内容请阅读Python的官方文档)。
mysite/settings.py:该Django 项目的设置/配置。Django 设置 将告诉你这些设置如何工作。
mysite/urls.py:该Django项目的URL声明;你的Django站点的“目录”。 你可以在URL 分配器 中阅读到关于URL的更多内容。
mysite/wsgi.py:用于你的项目的与WSGI兼容的Web服务器入口。 更多细节请参见如何利用WSGI进行部署。**
**默认情况下,INSTALLED_APPS包含下面的应用,它们都是Django 与生俱来的:
django.contrib.admin —— 管理站点。你将在本教程的第2部分使用到它。
django.contrib.auth —— 认证系统。
django.contrib.contenttypes —— 用于内容类型的框架。
django.contrib.sessions —— 会话框架。
django.contrib.messages —— 消息框架。
django.contrib.staticfiles —— 管理静态文件的框架。**
**修改你的模型(在models.py中)。
运行python manage.py makemigrations 来为这些修改创建迁移文件
运行python manage.py migrate 以运用这些改变到数据库中。**
绕开 manage.py
如果你不想使用manage.py,也没问题。只要设置DJANGO_SETTINGS_MODULE 环境变量为 mysite.settings,启动一个普通的Python shell,然后建立Django:
import django
django.setup()
如果以上命令引发了一个AttributeError,可能是你使用了一个和本教程不匹配的Django版本。 你可能需要换一个老一点的教程或者换一个新一点的Django版本。
你必须在与manage.py相同的目录下运行python,或确保你的目录在Python 的路径中,这样import mysite才可以工作。
所有这些信息,请参见django-admin 的文档。
str_ 还是 unicode?
对于Python 3来说,这很简单,只需使用str()。
对于Python 2来说,你应该定义unicode()方法并返回unicode 值。Django 模型具有一个默认的str() 方法,它会调用unicode()并将结果转换为UTF-8 字节字符串。这意味着unicode(p)将返回一个Unicode 字符串,而str(p)将返回一个字节字符串,其字符以UTF-8编码。Python 的行为则相反:对象的unicode方法调用 str方法并将结果理解为ASCII 字节字符串。这个不同点可能会产生困惑。
如果以上这些令你费解的话,那就使用Python 3吧。
from polls.models import Question, Choice
Make sure our str() addition worked.
Question.objects.all()
[
Django provides a rich database lookup API that’s entirely driven by
keyword arguments.
Question.objects.filter(id=1)
[
Get the question that was published this year.
from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)
Request an ID that doesn’t exist, this will raise an exception.
Question.objects.get(id=2)
Traceback (most recent call last):
…
DoesNotExist: Question matching query does not exist.
Lookup by a primary key is the most common case, so Django provides a
shortcut for primary-key exact lookups.
The following is identical to Question.objects.get(id=1).
Question.objects.get(pk=1)
Make sure our custom method worked.
q = Question.objects.get(pk=1)
q.was_published_recently()
True
Give the Question a couple of Choices. The create call constructs a new
Choice object, does the INSERT statement, adds the choice to the set
of available choices and returns the new Choice object. Django creates
a set to hold the “other side” of a ForeignKey relation
(e.g. a question’s choice) which can be accessed via the API.
q = Question.objects.get(pk=1)
Display any choices from the related object set – none so far.
q.choice_set.all()
[]
Create three choices.
q.choice_set.create(choice_text=’Not much’, votes=0)
q.choice_set.create(choice_text=’The sky’, votes=0)
c = q.choice_set.create(choice_text=’Just hacking again’, votes=0)
Choice objects have API access to their related Question objects.
c.question
And vice versa: Question objects get access to Choice objects.
q.choice_set.all()
[, , ]
q.choice_set.count()
3
The API automatically follows relationships as far as you need.
Use double underscores to separate relationships.
This works as many levels deep as you want; there’s no limit.
Find all Choices for any question whose pub_date is in this year
(reusing the ‘current_year’ variable we created above).
Choice.objects.filter(question__pub_date__year=current_year)
[, , ]
Let’s delete one of the choices. Use delete() for that.
c = q.choice_set.filter(choice_text__startswith=’Just hacking’)
c.delete()
外层的mysite/根目录仅仅是项目的一个容器。它的命名对Django无关紧要;你可以把它重新命名为任何你喜欢的名字。
manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互。 你可以在django-admin和manage.py中读到关于manage.py的所有细节。
内层的mysite/目录是你的项目的真正的Python包。它是你导入任何东西时将需要使用的Python包的名字(例如 mysite.urls)。
mysite/init.py:一个空文件,它告诉Python这个目录应该被看做一个Python包。 (如果你是一个Python初学者,关于包的更多内容请阅读Python的官方文档)。
mysite/settings.py:该Django 项目的设置/配置。Django 设置 将告诉你这些设置如何工作。
mysite/urls.py:该Django项目的URL声明;你的Django站点的“目录”。 你可以在URL 分配器 中阅读到关于URL的更多内容。
mysite/wsgi.py:用于你的项目的与WSGI兼容的Web服务器入口。 更多细节请参见如何利用WSGI进行部署。
Polls change list page, updated
你可以点击其中一列的头部来让列表按照这列的值来进行排序 —— 除了was_published_recently这列的头部,因为Django不支持按照随便一个方法的输出进行排序。另外注意, was_published_recently这列的头部默认是这个方法的名字(用空格取代下划线),并且这列的每一项内容都是用返回值的字符串形式表示。
现在又是一个好时机来告诉你变更列表界面提供方便的分页功能。 默认每页显示100条。 Change list pagination、search boxes、filters、date-hierarchies和column-header-ordering 都将按照你设想的那样工作。
自定义管理站点的外观¶
很明显,每个管理页面的顶部都有“Django administration”还蛮搞笑的。它仅仅起到了占位符的作用。
它可以用Django的模板系统轻松改变。 Django的管理站点是用Django自己制作出来的,它的界面代码使用的是Django自己的模板系统。
自定义项目的模板¶
在你项目的文件夹内创建一个templates目录(包含 manage.py的目录)。模板可以放在Django能访问到的文件系统任何地方。 (运行你的服务器的用户即是运行Django的用户)。然而,将模板放在你的项目目录下是一个应该遵循的非常好的约定。
打开你的配置文件(记住是mysite/settings.py)在TEMPLATES 设置中添加一个DIRS 选项:
mysite/settings.py
TEMPLATES = [
{
‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)],
‘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’,
],
},
},
]
DIRS 是加载Django模板时检查的一个文件系统目录列表;它是一个搜索路径。
现在,在templates下创建一个名为admin的目录,然后将admin/base_site.html从Django源码中管理站点的模板目录(django/contrib/admin/templates)拷贝到这个目录中。