看的Django 1.8.2 中文文档,地址:http://python.usyiyi.cn/django_182/intro/tutorial01.html ,想学习的直接看这个文档吧。这篇文章全是摘的中文文档的内容的。
$ django-admin startproject mysite
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
这些文件是:
$ python manage.py migrate
在mysite目录下,运行以下命令:
$ python manage.py runserver
你将看到命令行下输出了以下内容:
Performing system checks... 0 errors found May 13, 2015 - 15:50:53 Django version 1.8, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
$ python manage.py runserver 8080 # 修改端口为8080
$ python manage.py runserver 0.0.0.0:8000 # 修改IP和端口,当IP为0.0.0.0时,可以监听任意的网络接口
在与manage.py相同的目录下,并且键入以下命令来创建你的应用:
$ python manage.py startapp polls
这将创建一个目录polls,它的结构如下:
polls/
__init__.py
admin.py
migrations/
__init__.py
models.py
tests.py
views.py
比如我们编辑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)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
上述代码非常直观。每个模型都用一个类表示,该类继承自django.db.models.Model。每个模型都有多个类变量,而每一个类变量又都代表了数据库表中的一个字段。
每个字段通过Field类的一个实例表示 —— 例如字符字段CharField和日期字段DateTimeField。这种方法告诉Django,每个字段中保存着什么类型的数据。Django支持所有常见的数据库关联:多对一、多对多和一对一。
有了上面的代码,Django在polls应用激活(安装)时就可以:
编辑mysite/settings.py文件,并修改INSTALLED_APPS设置以包含字符串'polls'。所以它现在是这样的:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)
现在Django知道要包含polls应用。 让我们运行另外一个命令:
$ python manage.py makemigrations polls
你应该看到类似下面的内容:
Migrations for 'polls':
0001_initial.py:
- Create model Question
- Create model Choice
- Add field question to choice
通过运行makemigrations告诉Django,已经对模型做了一些更改(在这个例子中,你创建了一个新的模型)并且会将这些更改存储为迁移文件。Django使用迁移文件来保存对模型的更改(即数据库模式的更改)—— 所谓迁移文件其实就是磁盘上的普通文件。
sqlmigrate命令接收迁移文件的名字并返回它们的SQL语句:
$ python manage.py sqlmigrate polls 0001
你应该会看到类似如下的内容(为了便于阅读我们对它重新编排了格式):
BEGIN;
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL
);
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
COMMIT;
请注意以下几点:
模型变更的三个步骤:
如下命令来调用Python shell:
$ python manage.py shell
首先,我们需要创建一个能够登录管理站点的用户。 运行如下命令:
$ python manage.py createsuperuser
键入你想要使用的用户名,然后按下回车键:
Username: admin
然后提示你输入想要使用的邮件地址:
Email address: [email protected]
最后一步是输入你的密码。 你将被要求输入你的密码两次,第二次输入是为了确认第一次的输入。
Password: **********
Password (again): *********
Superuser created successfully.
我们需要告诉管理站点Question 对象要有一个管理界面。 要做这件事,需要打开polls/admin.py文件,把它编辑成这样:
from django.contrib import adminfrom .models import Questionadmin.site.register(Question)
让我们来编写第一个视图。 打开polls/views.py文件并将以下Python代码写入:
from django.http import HttpResponsedef index(request):return HttpResponse("Hello, world. You're at the polls index.")
这可能是Django中最简单的视图。 为了能够调用这个视图,我们需要将这个视图映射到URL上 —— 利用一个URLconf。
为了在投票应用目录内部创建URLconf,需要创建一个urls.py文件。你的应用的目录现在看起来应该像这样:
polls/
__init__.py
admin.py
models.py
tests.py
urls.py
views.py
在polls/urls.py文件中键入如下代码:
from django.conf.urls import url
from . import views
urlpatterns = [url(r'^$', views.index, name='index'),]
下一步,让主URLconf可以链接到polls.urls模块。在mysite/urls.py中插入一个include():
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [url(r'^polls/', include('polls.urls')),url(r'^admin/', include(admin.site.urls)),]
页面的设计被硬编码在视图中。 如果你想更改页面的外观,就得编辑这段Python代码。
首先,在你的polls目录下创建一个叫做 templates的目录。Django将在这里查找模板。
按照惯例,DjangoTemplates在 INSTALLED_APPS所包含的每个应用的目录下查找名为"templates"子目录。
将以下的代码放入模板文件:
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
现在让我们更新polls/views.py中的index视图来使用模板:
from django.http import HttpResponse
from django.template import RequestContext, loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = RequestContext(request, {
'latest_question_list': latest_question_list,
})
return HttpResponse(template.render(context))
重写后的index()视图:
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
教程中的这个项目只有一个应用polls。在真实的Django项目中,可能会有五个、十个、二十个或者更多的应用。 Django如何区分它们URL的名字呢? 例如,polls 应用具有一个detail 视图,相同项目中的博客应用可能也有这样一个视图。当使用模板标签{% url %}时,人们该如何做才能使得Django知道为一个URL创建哪个应用的视图?
答案是在你的主URLconf下添加命名空间。 在mysite/urls.py文件中,添加命名空间将它修改成:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
]
现在将你的模板polls/index.html由:
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
修改为指向具有命名空间的详细视图:
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
首先,打开polls/urls.py 这个URLconf 并将它修改成:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]
下一步,我们将删除旧的index、detail和 results 视图,并用Django的通用视图代替。打开polls/views.py文件,并将它修改成:
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views import generic
from .models import Choice, Question
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
def vote(request, question_id):
... # same as above
我们在这里使用两个通用视图:ListView 和 DetailView。这两个视图分别抽象“显示一个对象列表”和“显示一个特定类型对象的详细信息页面”这两种概念。
默认情况下,通用视图DetailView 使用一个叫做<app name>/<model name>_detail.html的模板。在我们的例子中,它将使用"polls/question_detail.html"模板。template_name属性是用来告诉Django使用一个指定的模板名字,而不是自动生成的默认名字。 我们也为results列表视图指定了template_name —— 这确保results视图和detail视图在渲染时具有不同的外观,即使它们在后台都是同一个 DetailView。