Django 速成

2.1 创建项目:

 组织Django代码最简单的方式是使用Django的项目(project):

一个包含了组成单个网站的所有文件的目录。

在blog项目创建一个项目目录的django.admin.py命令是:
[root@node01 django]# django-admin.py startproject mysite
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, in <module>
    from django.core import management
ImportError: No module named django.core

Cleaning up...
[root@node01 django]# python
Python 2.7.3 (default, Jul 20 2017, 18:40:16) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.version
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'version'
>>> django.VERSION
(1, 11, 7, u'final', 0)


[root@node01 django]# django-admin.py startproject mysite
[root@node01 django]# ls
mysite



如果你精通Python的话,你一定知道__init__.py 会把这个项目目录变成一个Python的包(package)


除了__init__.py,startproject命令还创建了以下三个文件:

1.manage.py 文件是一个同这个Django 项目一起工作的工具,你可以从它在目录列表中的权限里

看到它是可以执行的

2.settings.py 文件包含了项目的默认设置, 包括数据库信息,调试标志以及其他一些重要的变量。


2.2 运行开发服务器:

运行开发服务器 简单到只需要一个命令就行,


2.3 创建Blog应用:

有了项目之后,就可以在它下面创建应用.

node2:/django/mysite#./manage.py startapp blog
node2:/django/mysite#



node2:/django/mysite#ls
blog  manage.py  mysite


和项目一样,app也是一个包。现在models.py和views.py 里还没有真正的代码,它们只是先占住位置而已。

要告诉Django这个app是项目里的一部分,你需要去编辑settings.py


2.4 
设计你的model:

现在我们来到了这个基于Django的blog应用的核心部分:models.py 文件,这里我们定义blog数据结构的地方。

根据DRY原则,Django 会尽量利用你提供给应用程序的model信息。

node2:/django/mysite/blog#cat models.py 
from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()
    class Meta:
      ordering =('-timestamp',)


这是一个完整的model,代表了一个有3个变量的"BlogPost"对象,(严格说应该有4个,Django会默认


为每隔model自动驾驶一个自增的,唯一的id变量.)


class BlogPost(models.Model):  继承了models.Model 


2.5 设置数据库:

使用数据库,

'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'tlcb',
'USER': 'root',
'PASSWORD': '1234567',
'HOST': '192.168.137.3',
'PORT': '3306',
}
}

创建表:

现在你可以告诉Django用你提供的连接信息去连接数据库并且设置应用程序所需的表,命令很简单:



./manage.py syncdb 


node2:/django/mysite#./manage.py syncdb 
Unknown command: 'syncdb'
Type 'manage.py help' for usage.
node2:/django/mysite#

1.8还是哪个版本开始,django移除了syncdb命令,同步(迁移)数据库用如下两个命令:

在Django 1.9及未来的版本种使用migrate代替syscdb.

1
./manage.py migrate

node2:/django/mysite#./manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
node2:/django/mysite#


node2:/django/mysite#./manage.py migrate 
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
node2:/django/mysite#./manage.py makemigrations
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model BlogPost
node2:/django/mysite#./manage.py migrate 
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  No migrations to apply.



node2:/django/mysite/blog#cat models.py
from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()
    class Meta:
      ordering =('-timestamp',)

当你执行./manage.py migrate 命令时,Django会查找INSTALLED_APPS里的每一个models.py文件,

并为找到的每一个model都创建一张数据库表。



启动Django:

node2:/django/mysite#python manage.py runserver 0.0.0.0:8080
Performing system checks...

System check identified no issues (0 silenced).
November 08, 2017 - 17:22:02
Django version 1.11, using settings 'mysite.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.

DisallowedHost at /

Invalid HTTP_HOST header: '192.168.137.3:8080'. You may need to add u'192.168.137.3' to ALLOWED_HOSTS.



django-admin.py startproject project-name创建的项目中去修改 setting.py 文件:
ALLOWED_HOSTS = ['*']  #在这里请求的host添加了*


2.6 设置自动admin应用:


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]



http://192.168.137.3:8080/admin/login/?next=/admin/

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]


设置完app以后,我们需要为它指定一个URL这样才能访问它,你应该已经注意到了在自动生成的urls.py中的这样两行代码:


urlpatterns = [
    url(r'^admin/', admin.site.urls),
]



node2:/app/mysite/blog#cat models.py
from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()
    class Meta:
      ordering =('-timestamp',)
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title','timestamp')
admin.site.register(BlogPost,BlogPostAdmin)
class Book(models.Model):
    title=models.CharField(max_length=100)
    author=models.URLField(max_length=200)
    length=models.IntegerField()

2.7  试用admin


到这里我们已经在Django里设置了admin app并向其注册了model.


创建admin,用户密码:

node2:/django/mysite#python manage.py createsuperuser


3个最创建的 我的app 没有显示在admin是:

1.忘记向admin.site.register 注册你的model类

2.models.py里有错误

3.忘记在settings.py中的INSTALLED_APPS里添加app

settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog'
]




node2:/django/mysite/blog#cat models.py
from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()
    class Meta:
      ordering =('-timestamp',)

class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title','timestamp')
admin.site.register(BlogPost,BlogPostAdmin)


2.8  建立Blog的公共部分:

完成我们应用的数据库部分和admin部分后,现在来看看面向公众的页面部分,从Django的角度来说,


一个页面具有3个典型的组件:

1.一个模板(template),模板负责将传递进来的信息显示出来  (前台页面)

2.一个视图(view)函数,它负责获取要显示的信息,通常都是从数据库获取

3.一个URL模式,它用来把收到的请求和你的视图函数匹配,有时也会向视图传递一些参数


创建模板:

Django的模板语言相当简单,我们直接来看代码

<h2>{{post.title}}</h2>
<p>{{post.timestamp}}</p>
<p>{{post.body}}</p>

它就是一个HTML(虽然Django模板可以用于任何形式的输出)加上一些大括号里的特殊模板标签。

这些就是变量标签(variable tag),用于显示传递给模板的数据。

在变量标签里,你可以用Python风格的dotted-notation(点记号)来访问传递给模板的对象的属性。

例如,这里假设你传递了一个叫"post"的BlogPost对象


现在我们稍微改进一下这个模板,通过Django的for模板标签让它能显示多篇帖子:


{% for post in posts %}
<h2>{{post.title}}</h2>
<p>{{post.timestamp}}</p>
<p>{{post.body}}</p>
{% endfor %}

原来的3行没有动,我们只是简单地增加了一个叫做for的块标签(block tag),

用它将模板渲染到序列中的每个元素上。


node2:/django/mysite/blog/templates#cat archive.html 
{% for post in posts %}
<h2>{{post.title}}</h2>
<p>{{post.timestamp}}</p>
<p>{{post.body}}</p>
{% endfor %}

把这5行模板代码保存到文件archive.html里,然后把文件放到你的blog app目录里的templates下

模板本身的名字是随意取的(叫它foo.html也没问题),但是templates目录的名字则是强制的。

Django在默认情况下会在搜素模板时逐个查看你安装的应用程序下的每一个templates目录。


创建一个视图函数:

现在我们来编写一个从数据库读取所有blog帖子的视图函数,并用我们的模板将它们显示出来,


打开blog/views.py文件并输入:

node2:/django/mysite/blog#cat views.py 
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# from django.shortcuts import render, render_to_response
from .models import *
# Create your views here.
from django.http import HttpResponse
from django.template import loader

def archive(req):
# get all blogpost objects
  posts = BlogPost.objects.all()
  #print blog_list
  template = loader.get_template('archive.html')
  context = {
  'posts':posts
  }
  print '------------------------------------------'
  print  HttpResponse(template.render(context, req))
  print '------------------------------------------'
  return HttpResponse(template.render(context, req))


node2:/django/mysite/blog#cat models.py
from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()
    class Meta:
      ordering =('-timestamp',)
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title','timestamp')
admin.site.register(BlogPost,BlogPostAdmin)
node2:/django/mysite/blog#


第5行:每个Django视图函数都将django.http.HttpRequest对象作为它的第一个参数,

它还可以通过URLconf接受其他参数,你将来回大量用到这个特性。

第6行:

当我们把 posts = BlogPost.objects.all() 类作为django.db.model.Model的一个子类时,

class BlogPost(models.Model):  BlogPost继承了models.Model


我们就获得了Django对象关系映射的全部里拉。


第7行:
 template = loader.get_template('archive.html')


这里我们只需要告诉Django模板的名字就能创建模板对象t,因为我们把它保存在app下的templates目录里,

Django无序更多指示就能找到它。

第8行:Django 模板渲染的数据是由一个字典类的对象context提供的,这里的context c只有一对键和值

  context = {
  'posts':posts
  }


创建一个URL模式;

我们的页面还差一步就可以工作了---和任何网页一样,它还需要一个URL



当然我们可以直接在mysite/urls.py 里创建所需的URL模式,但是那样做只会在项目和app

之间制造混乱的耦合。

第一步和激活admin很相似,在mysite/urls.py里有一行被注释的示例就是我们需要的代码:

from django.conf.urls import url
from django.contrib import admin
from blog import views as view
urlpatterns =( 
url(r'^admin/', admin.site.urls),
url(r'^blog/$',view.archive),
)


这回捕获任何以blog/开始的请求,并把它们传递给一个你马上要创建的URLconf.

第二步是在blog应用程序包里定义URL,创建一个包含如下内容的文件,

node2:/django/mysite/blog#cat views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# from django.shortcuts import render, render_to_response
from .models import *
# Create your views here.
from django.http import HttpResponse
from django.template import loader

def archive(req):
# get all blogpost objects
  posts = BlogPost.objects.all()
  #print blog_list
  template = loader.get_template('archive.html')
  context = {
  'posts':posts
  }
  print '------------------------------------------'
  print  HttpResponse(template.render(context, req))
  print '------------------------------------------'
  return HttpResponse(template.render(context, req))



2.9   最后的润色:

你有好几种方式来继续改进这个基本的blog引擎,我们来讨论几个关键的概念,

把这个项目弄的再漂亮点。

模板的精确定位:

node2:/django/mysite/blog/templates#cat base.html 
<html>
      <style type="text/css">
        body{color:#efd;background:#453;padding:0 5em;margin:0}
        h1{padding:2em 1em;background:#675}
        h2{color:#bf8;border-top:1px dotted #fff;margin-top:2em}
        p{margin:1em 0}
      </style>
     
      <body>
        <h1>操作工</h1>
        <h3>大人不华,君子务实</h3>
        {% block content %}
        {% endblock %}
      </body>
</html>

node2:/django/mysite/blog/templates#cat archive.html
{% extends "base.html" %}  
{% block content %}
      {% for post in posts %}
      <h2>{{  post.title }}</h2>
      <p>{{ post.timestamp | date:"1,F jS"}}</p>
      <p>{{ post.body }}</p>
      {% endfor %}
  {% endblock %}



按日期排序:

你应该已经注意到blog的帖子不是按照传统的时间倒叙排列的,告诉Django这么做非常简单。

设置model默认排序的方法是给它定一个Meta嵌套类,然后设置ordering属性

node2:/django/mysite/blog#cat models.py
from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()
    class Meta:
      ordering =('-timestamp',)
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title','timestamp')
admin.site.register(BlogPost,BlogPostAdmin)
node2:/django/mysite/blog#

通过模板过滤器格式化时间戳:

 虽然时间戳很好用,但是它的ISO8601格式却有点怪异,我们现在用Django模板系统里另一个很酷的特性;


过滤(filter)来把它浓的人性化一点。

原文地址:https://www.cnblogs.com/hzcya1995/p/13349432.html