A Complete Beginner's Guide to Django - Getting Started(二)

《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)

  • 定义了BoardTopicPost三个类。
  • 使用了内置的User
  • CharField里用了max_length, unique两个属性
  • DateTimeField使用了auto_now_add
  • ForeignKeyrelated_name, on_delete
  • 模型定义好了后,通过python manage.py makemigrationspython manage.py migrate可将变更在数据库中生效。

视图方面的更改

相对于Chapter 1, 将home函数修改如下:

1
2
3
4
5
6
7
8
from boards.models import Board


def home(request):
"""Home page"""
boards = Board.objects.all()

return render(request, 'home.html', {'boards': boards})
  • HttpResponse修改为显示Board里的真实数值
  • 定义了templatesstaticcss文件夹,不过他这里的方法为直接修改settings.py的设置,不利于不同app之间的文件隔离,所以我自己觉得是不妥的。
  • 介绍了如何将bootstrap的css文件加入到html代码中。

后台

boards/admin.py中添加如下代码:

1
2
3
from boards.models import Board

admin.site.register(Board)

  1. 通过python manage.py createsuperuser可以创建管理员账号
  2. 通过访问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)

我的收获有:

  1. self.client.get(url)可以模拟get操作,我以前都是form django.test import Client
  2. response.status_code可以获取http状态码
  3. view.func可以和视图函数做对比
  4. reverse:根据url定义中的name找到url
  5. resolve:根据url找到定义的视图函数
  6. python manage.py test --verbosity=2可以查看更详细的测试报告

通过shell获取settings配置信息

通过python manage.py shell打开shell,输入如下命令可以查看settings的配置

1
2
3
4
5
6
7
8
9
from 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'

0%