vimer linux kernel 爱好者

django笔记

2016-08-01

整体参考这篇文章

我建议看官方文档,这样效果才能明显.

安装

这个就先不仔细说明了,详情请了解这篇文章

如果出现:”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

Comments

Content