《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_add
ForeignKey
有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 Client
response.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'