Django搭建个人博客:View视图初探

5182阅读 · 11评论 · 2018/09/06发布   前往评论

数据库虽然已经有了,但是用户通常只需要这个庞大数据库中的很小一部分进行查看、修改等操作。为此还需要代码来恰当的取出并展示数据,这一部分代码就被称为视图

Django 中视图的概念是「一类具有相同功能和模板的网页的集合」。比如,在一个博客应用中,你可能会创建如下几个视图:

  • 博客首页:展示最近的几项内容。
  • 内容“详情”页:详细展示某项内容。
  • 评论处理器:用于响应为一项内容添加评论的操作。

这些需求都靠视图(View)来完成。

Hello World!

首先写一个最简单的视图函数,在浏览器中打印出Hello World!字符串。

打开article/views.py,写出视图函数:

article/views.py

# 导入 HttpResponse 模块
from django.http import HttpResponse

# 视图函数
def article_list(request):
    return HttpResponse("Hello World!")

网页都是从视图派生而来。每一个视图表现为一个简单的Python函数,它必须要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse对象,或者抛出一个异常,比如 Http404 。至于你还想干些什么,随便你。

视图函数中的request与网页发来的请求有关,里面包含getpost的内容、用户浏览器、系统等信息。Django调用article_list函数时会返回一个含字符串的 HttpResponse对象。

有了视图函数,还需要配置URLconfs,将用户请求的URL链接关联起来。换句话说,URLconfs的作用是将URL映射到视图中。

前面的文章中已经将URL分发给了article应用,因此这里只需要修改之前添加的article/urls.py就可以。添加以下代码:

article/urls.py

# 引入views.py
from . import views

...

urlpatterns = [
    # path函数将url映射到视图
    path('article-list/', views.article_list, name='article_list'),
]

Django 将会根据用户请求的 URL 来选择使用哪个视图。本例中当用户请求article/article-list链接时,会调用views.py中的article_list函数,并返回渲染后的对象。参数name用于反查url地址,相当于给url起了个名字,以后会用到。

测试一下刚才敲的代码是否工作正常。

在虚拟环境中,进入项目目录,也就是my_blog文件夹,输入python manage.py runserver,运行调试服务器:

(env) E:\django_project\my_blog>python manage.py runserver

Performing system checks...

System check identified no issues (0 silenced).
August 30, 2018 - 19:41:00
Django version 2.1, using settings 'my_blog.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

成功运行后,打开浏览器,输入url地址http://127.0.0.1:8000/article/article-list/,其中127.0.0.1:8000是调试服务器的本地地址,article是项目路由my_blog\urls.py分发的地址,article-list是刚才配置的article\urls.py应用分发的地址。

运气好的话,浏览器中会打印出Hello World!字符串:

不到10行代码就完成了基本功能,是不是很神奇。

当然,只是小试牛刀。

准备工作

在章节编写Model模型中虽然定义了数据库表,但是这个表是空的,不方便展示View调取数据的效果。所以在写View之前,需要往数据表里记录一些数据。接下来就做这个工作。

网站后台概念

网站后台,有时也称为网站管理后台,是指用于管理网站的一系列操作,如:数据的增加、更新、删除等。在项目开发的初期,因为没有真实的用户数据和完整的测试环境,会频繁地使用后台修改测试数据。

Django内置了一个很好的后台管理工具,只需要些少量代码,就可以实现强大的功能。

创建管理员账号(Superuser)

管理员账号(Superuser)是可以进入网站后台,对数据进行维护的账号,具有很高的权限。这里我们需要创建一个管理员账号,以便添加后续的测试数据。

虚拟环境中输入python manage.py createsuperuser指令,创建管理员账号:

(env) E:\django_project\my_blog>python manage.py createsuperuser
Username: dusai
Email address: dusaiphoto@foxmail.com
Password:
Password (again):
Superuser created successfully.

指令会提示你输入账号名字、邮箱和密码,根据喜好填入即可。

将ArticlePost注册到后台中

接下来我们需要“告诉”Django,后台中需要添加ArticlePost这个数据表供管理。

打开article/admin.py,写入以下代码:

article/admin.py

from django.contrib import admin

# 别忘了导入ArticlerPost
from .models import ArticlePost

# 注册ArticlePost到admin中
admin.site.register(ArticlePost)

这样就简单的注册好了。

在后台中遨游

细心的同学可能已经发现,Django项目生成的时候就自动配置好了后台的settings和url,因此不需要我们再操心了。

启动server,在浏览器中输入http://127.0.0.1:8000/admin/,一切正常的话就看到下面的登录界面了:

输入刚才创建的管理员账号,登录进去:

红框内就是刚才添加的ArticlePost数据表,点击进入后,再点击右上角的ADD ARTICLE POST按钮,到达如下页面:

仔细看一下表单中的每一项,发现与ArticlePost中的字段完全符合;因为updated字段指定了自动添加,这里就没显示了。

将表单填好后,点击保存:

可以看到ARTICLE POST中多了刚才录入的一条数据。按照同样的方法,再写入几条数据:

至此准备工作就已经大功告成。

检视数据库

2018-10-29 新增内容

通过上面的操作,我们的数据库中已经有1条用户数据、3条文章数据了。有的时候我需要检查数据库中的数据是否正确,但是项目中的数据库文件db.sqlite3又无法直接打开,怎么办呢?

这时候就需要用到专门处理SQLite数据文件的软件了:SQLiteStudio

下载并安装,用它打开db.sqlite3,软件导航栏中就出现了数据库中保存的各类数据列表。比如说auth_user就是用户数据表了:

你可以用它检查项目代码中数据库的操作是否正常,这在开发阶段是非常实用的。

总结

本章初步感受了View的工作模式,创建了Superuser在后台录入了几条测试数据。

下一章将编写更有意义的View,准备好后老司机就开车了。





<< 上一章 下一章 >>
本文作者: 杜赛
发布时间: 2018年09月06日 - 19:44
最后更新: 2019年03月10日 - 14:24
知识共享许可协议   转载请保留原文链接及作者



登录 后回复

共有11条评论

avatar
Python 么么哒! 1
本回复已被 Python 删除

6个月前 回复


avatar
charley 么么哒! 1

后台添加文章后不显示标题名,只显示   ArticlePost object 

2个月前 回复


avatar
杜赛 [博主] charley 么么哒! 1

model里没写 __str__() 方法

2个月前 回复


avatar
13242934754 杜赛 [博主] 么么哒! 1
本回复已被 13242934754 删除

2个月前 回复


avatar
hlilyjiaxin 么么哒! 1

博主,继之前数据同步的错误后,继续走还是一堆bug,是因为代码没完善的原因吗?

(env) D:\django_project\my_blog>python manage.py createsuperuser
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "D:\django_project\env\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "D:\django_project\env\lib\site-packages\django\core\management\__init__.py", line 357, in execute
    django.setup()
  File "D:\django_project\env\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "D:\django_project\env\lib\site-packages\django\apps\registry.py", line 112, in populate
    app_config.import_models()
  File "D:\django_project\env\lib\site-packages\django\apps\config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\jiaxin\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "D:\django_project\my_blog\article\models.py", line 5, in <module>
    class ArticlePost(models.Model):
  File "D:\django_project\my_blog\article\models.py", line 6, in ArticlePost
    author = models.Foreignkey(User, on_delete=models.CASCADE)
AttributeError: module 'django.db.models' has no attribute 'Foreignkey'


 

2个月前 回复


avatar
杜赛 [博主] hlilyjiaxin 么么哒! 1

ForeignKey

不是Foreignkey

2个月前 回复


avatar
hlilyjiaxin 杜赛 [博主] 么么哒! 1

好的。谢谢回复。我会注意的

2个月前 回复


avatar
nameisufr 么么哒! 1

报告一个错误:

非教程错误,是Django的bug,在Django2.1 版本下迁移数据表,然后在Django控制台添加数据会出现django.db.utils.OperationalError: no such table: main.auth_user__old的错误。

解决办法:   将sqlite中除system catalogue下的所有表全删掉,然后安装Django2.1.5,重新迁移数据,运行。

                                             --------------来自一个完全安照教程敲代码却遇到这种问题,调试了1个小时的卑微coder

2个月前 回复


avatar
杜赛 [博主] nameisufr 么么哒! 1

去了解了一下,这个错误确实是由于django和splite版本兼容性引起的,属于框架给开发者挖的坑..

感谢您的评论,给其他人提个醒

2个月前 回复


avatar
yanchao-zhangzyc 杜赛 [博主] 么么哒! 1

OperationalError at /admin/article/articlepost/add/

no such table: article_articlepost

Request Method:POSTRequest URL:http://127.0.0.1:8000/admin/article/articlepost/add/Django Version:2.1Exception Type:OperationalErrorException Value:

no such table: article_articlepost

Exception Location:C:\Python37\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 296Python Executable:C:\Python37\python.exePython Version:3.7.4Python Path:

['E:\\python_project\\Django_project\\my_blog',
 'C:\\Python37\\python37.zip',
 'C:\\Python37\\DLLs',
 'C:\\Python37\\lib',
 'C:\\Python37',
 'C:\\Users\\yanch\\AppData\\Roaming\\Python\\Python37\\site-packages',
 'C:\\Python37\\lib\\site-packages']

Server time:Sat, 13 Jul 2019 05:28:25 +0000

 

 

我也碰到这个问题了,没早点看到这条回复,弄了半天没弄好。后来查是数据库的问题

1个月前 回复


avatar
ac1864 么么哒! 1

今天开始第二遍学习。

希望能搞懂每行代码。
这遍可能会问比较多傻问题。
目前还没有问题。

2个月前 回复