我建议看官方文档,这样效果才能明显.
安装
这个就先不仔细说明了,详情请了解这篇文章
如果出现:”ImportError: No module named django”,请确保使用:
PYTHONPATH=/path/to/django/parent/dir
即可导入了django,关于这个Django包在什么地方,你可以使用 pip命令重新安装交一遍django,这样就可以了,有关PYTHONPATH应该加到用户配置文件中。
建立项目
django的源代码放在什么地方呢?最好不要放在/root 目录下,因为这样的话会给/root 目录带来风险。
在django的源代码的目录下,键入命令
django-admin startproject mysite
其中,mysite 可以是任何名字,只要你喜欢就成了。这是在该目录下会生成mysite目录,其中的内容如下:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
其中manage.py激活Django项目
子目录mysite是针对你创建的项目的包,可以导入任何你想要导入的
init.py 告诉python这是针对python的包。
settings.py是针对Django项目的配置文件。
urls.py Django项目的URLS的声明文件,这里面是关于你Django项目的”内容表”
wsgi.py 是WSGI兼容的web服务器,
还要记住一点,python是MVC(model view controler)模型的。 因为本对python不是很熟,所以这块也不是很明白
打开服务
使用以下命令,
python manage.py runserver
当然,前提实在相应的目录下执行这条命令。然后就冒出一大串文字。其中会有这么一大串
…Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
我的是安在了遥远的VPS上,只能利用lynx去间接访问127.0.0.1:8000,显示了It works,但是怎么能在前台浏览器上查看效果呢?使用下面的命令:
python manage.py runserver 0.0.0.0:8000
然后在你的前段浏览器输入vps的ip:8000,就可以看见It works!再再就是,由于我的项目目录建立在了/root下,导致了Disallow的警告。
注意:
有时候并不是上面的原因导致了DisallowedHost,’You may need to add ip to ALLOWED_HOSTS’
你可以将项目里的setting.py中ALLOWED_HOSTS=[‘ip’,’localhost’, ‘127.0.0.1’],设置进去就可以。
创建polls应用
这里先说一下项目与应用的关系,在原始文档里项目是project,应用是app,在使用命令的时候你也可以看见这两种的区别,一个项目可以由多个app组成,这就是基本的逻辑关系。按照官网上的说法,你的app可以放在系统的任何位置,为了方便,我建议放在项目的平行目录(与顶层的manage.py平行即可)。
python manage.py startapp polls
会在源目录下产生polls目录,里面包含:
.
├── admin.py
├── apps.py
├── __init__.py
├── __init__.pyc
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
├── urls.py
├── urls.pyc
├── views.py
└── views.pyc
写下第一个视图
打开polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
HttpResponse 的意思是在页面上打印出这句话,可以简化为print。
打开polls/urls.py文件
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]
这块的知识不太一样了,请看下面哈.新版的django不推荐使用url,改为了path,道理差不多,大家可以看看下面的内容,就应该理解了。
运行程序
python manage.py runserver 0.0.0.0:8000
浏览http://ip:8000/polls 就会看见polls的内容了. url这里是一个函数
建立数据库
在生成mysite的同事,Django会默认生成sqllite3数据库,在mysite/setting.py中DATABASES 字段就是关于数据库的.
设置时区
INSTALLED_APPS 字段
这个字段是安装在 项目 下的setting.py文件中,即:只要你修改了 应用的 models.py,在做数据迁移之前,必须让项目的setting.py文件知道你的修改。
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
...
]
注意这些字段,比较关键。后期的应用要注意这些。
创造模式models
这个玩意包含你的数据库构架(databases layout),在这个poll app中,我们将会创建两个models: Question和Choice. 前者有一个question和一个公开的日期;后者有两个域:文本选择域和一个vote tally.每一个Choice 对应一个Question.
在你的项目polls下编辑文件models.py:
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length = 200)
pub_data = models.DateTimeField('data 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)
python manage.py makemigrations polls
生成:
Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
下面的命令是告诉django返回刚才数据改变时可读的sql文本。
python manage.py sqlmigrate polls 0001
生成:
BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id"
integer NOT NULL REFERENCES "polls_question" ("id"));
INSERT INTO "polls_choice" ("choice_text", "votes", "id", "question_id")
SELECT "choice_text", "votes", "id", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
COMMIT;
python manage.py check
如果在生成数据库的时候有麻烦了,使用这个命令检查一下 makemigrations这句命令只是你告诉Django你做出了一些数据改动,然而使用下面的命令进行存储数据:
python manage.py migrate
migrate命令将INSTALLED_APPS的字段全部用上了. 下面是migrate的输出:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
After Playing with the API: in https://docs.djangoproject.com/en/2.0/intro/tutorial02
中文化
后台的中文化
在setting.py中,在中间件MiddleWare添加这么一句:
'django.middleware.locale.LocaleMiddleware','
这样你的管理后台就是中文化的了。
模板中文化
默认的 Django后台,均显示Django adminsteration略微难看,下面是解决的方法。
编辑项目目录下的urls.py,在末尾添加这三行:
admin.site.site_header = u'我是网站后台'
admin.site.index_title = u'我是站点管理'
admin.site.site_url = 'www.xxx.xxx'
应用的中文化
在appname/apps.py可以设置有关app的消息,请看下面的文章: here
表名的中文化
修改相应的models.py即可,在定义的Meta中定义:
class Meta:
verbose_name = u'单数名称'
verbose_name_plural = u'复数名称'
注册
我们已经知道了,如果仅仅是进行三步的数据迁移,是不够的,还必须向网站进行注册. 在自己项目的目录下,找到admin.py:
from learn_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
当然,这个项目是你自己的项目,但是这个模式不变的,在你在models.py中写了一个字段,数据迁移完成后必须在admin.py中注册一下。
这一步是不用数据迁移的,可以直接使用的
Django shell
和你注册时的状况一样,看看下面的代码:
python manage.py shell
>>> from learn_log2.models import Topic
>>> topic.objects.all()
...
>>> for topic in topics:
print(topic.id, topic)
...
>>> t = Topic.objects.get(id=1)
>>> t.text
>>> t.date_added
创建网页
映射URL
编写视图
这里的视图文件就是你要向浏览者展示的页面,是你以后主要编写代码的地方。 先写一个最简单的。
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello,this is my first view")
为了能够访问这个页面,需要指定urls.
接着是创建项目的url
在应用目录下新建一个urls.py文件,写入下面的代码:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index')
]
不知道大家能不能看出一些含义在里面,path方法需要的参数需要你在views.py中事先定义好,这一点是显而易见的。
项目的urls.py,
from django.conf.urls import include, path
# 版本1.0的是url,上面是2.0
from django.contrib import admin
urlpatterns = [
path('app', include('app.urls'))
]
这里path方法中的include也是同样的思路,上面的app就是你自己的项目名称。
这时你在浏览器中127.0.0.1:8000/polls中就可以查看页面了,当然,后台使用
python manage.py runserver