《A Complete Beginner’s Guide to Django》 是由 Vitor Freitas 写作的 Django 入门教程。
本文是根据第二章 Part 2 - Fundamentals 精简而来。
本章介绍了model、view、url、amdin、后台管理界面、static、template方面的内容。
最终效果

定义model
编辑boards/views.py,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Board(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)
class Topic(models.Model):
    subject = models.CharField(max_length=255)
    last_updated = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, related_name='topics', on_delete=models.CASCADE)
    starter = models.ForeignKey(User, related_name='topics', on_delete=models.CASCADE)
class Post(models.Model):
    message = models.TextField(max_length=4000)
    topic = models.ForeignKey(Topic, related_name='posts', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)
    created_by = models.ForeignKey(User, related_name='posts', on_delete=models.CASCADE)
    updated_by = models.ForeignKey(User, null=True, related_name='+', on_delete=models.CASCADE)
- 定义了
Board,Topic,Post三个类。 - 使用了内置的
User类 CharField里用了max_length,unique两个属性DateTimeField使用了auto_now_addForeignKey有related_name,on_delete- 模型定义好了后,通过
python manage.py makemigrations和python manage.py migrate可将变更在数据库中生效。 
视图方面的更改
相对于Chapter 1, 将home函数修改如下:
1  | from boards.models import Board  | 
- 将
HttpResponse修改为显示Board里的真实数值 - 定义了
templates,static和css文件夹,不过他这里的方法为直接修改settings.py的设置,不利于不同app之间的文件隔离,所以我自己觉得是不妥的。 - 介绍了如何将bootstrap的css文件加入到html代码中。
 
后台
在boards/admin.py中添加如下代码:1
2
3from boards.models import Board
admin.site.register(Board)
- 通过
python manage.py createsuperuser可以创建管理员账号 - 通过访问http://127.0.0.1:8000/admin/可登录后台
 
测试
这是我最感兴趣的内容了,文章提供了两个单元测试用例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.urls import reverse, resolve
from django.test import TestCase
from .views import home
# Create your tests here.
class HomeTests(TestCase):
    def test_home_view_status_code(self):
        url = reverse('home')
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
    def test_home_url_resolves_home_view(self):
        view = resolve('/')
        self.assertEqual(view.func, home)
我的收获有:
self.client.get(url)可以模拟get操作,我以前都是form django.test import Clientresponse.status_code可以获取http状态码view.func可以和视图函数做对比reverse:根据url定义中的name找到urlresolve:根据url找到定义的视图函数python manage.py test --verbosity=2可以查看更详细的测试报告
通过shell获取settings配置信息
通过python manage.py shell打开shell,输入如下命令可以查看settings的配置1
2
3
4
5
6
7
8
9from django.conf import settings
settings.BASE_DIR
'/Users/vitorfs/Development/myproject'
import os
os.path.join(settings.BASE_DIR, 'templates')
'/Users/vitorfs/Development/myproject/templates'