编写视图 在blog/views.py
文件里添加
from django.views.generic import ListView
from blog.models import Postclass IndexView(ListView):
model = Post
context_object_name = 'posts'
template_name = 'blog/index.html'
这里是使用的是基于类的视图,由于要主页要展示的是
Post
的列表,所以需要继承ListView
,用model
指定要使用的模型,template_name
指定对应的模板文件,后面再编写,context_object_name
指定模型列表在模板里的名字,默认是object_list
对应的视图函数写法是
from django.shortcuts import render
from blog.models import Postdef index(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', {'posts': posts})
编写模板文件 在
blog
目录创建templates
目录,再创建blog
目录,新建一个index.html
,内容如下
{% for post in posts %}
- {{ post.title }}
{% endfor %}
通过
for
标签将posts
遍历,将post.title
显示在列表里 这样,最简单的模板就生成了
同时将当前的模板目录添加到设置里,让模板引擎找得到对应的模板文件
修改
web/settings.py
,将templates
添加到TEMPLATES
的DIRS
列表里TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'blog', 'templates')],
...
}
配置url 在
blog
路径下创建urls.py
文件,添加from django.conf.urls import urlfrom . import viewsurlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
]
url
函数第一个参数,是一个正则表达式,这里是'^$'
,代表为空,所以访问http://127.0.0.1:8000/
就是这个页面 第二个参数是一个视图函数,由于这里是使用的基于类的视图,所以需要调用
as_view()
来返回一个视图函数 name
参数是一个命名,可以通过index
这个名字来找到对应的url
由于默认的
ROOT_URLCONF
是'web.urls'
,所以需要将blog/urls.py
配置到web/urls.py
里面urlpatterns = [
...
url(r'^blog/', include('blog.urls', namespace='blog')),
]
这里url函数第一个参数是
r'^blog/'
,所以blog
的url
都自带一个前缀blog
,主页的的url
也变成了http://127.0.0.1:8000/blog/
namespace
指定了命名空间,必须通过blog:index
这个名字来找到主页,这是为了避免不同应用url
冲突如果为了
http://127.0.0.1:8000/
也可以访问主页,可以在web/urls.py
里面添加urlpatterns = [
...
url(r'^$', views.IndexView.as_view())
]
【django|Django 博客 - 4 编写第一个页面-主页】配置完后,启动服务器,浏览器访问
http://127.0.0.1:8000/blog/
,就可以看到博客主页了,目前只是一个博客标题的列表美化主页 由于主页模板什么样式都没有,所以比较简陋。可以使用自己熟悉的UI框架进行美化,因为我什么UI框架都不熟悉,所以我使用的是UIKit 3,比较容易上手
大部分页面都是有导航栏,并且使用相同的
css
和js
文件,因此可以编写一个基模板,其他模板继承基模板新建基模板文件
blog\templates\blog\base.html
{% block title %}Blog{% endblock %} - 锐客网
{% load static %}
{% block beforehead %}{% endblock %}
{% block body %}{% endblock %}
修改
blog\templates\blog\index.html
{% extends 'blog/base.html' %}{% block body %}
{% for post in posts %}
{{
{{ post.title }}
Written by {{ post.author.username }} on {{ post.created_time }}, {{ post.views }} views
{{ post.excerpt }}
{% endfor %}
{% endblock %}
再打开主页看一下,是不是没那么丑了
至此,主页就基本完成。
扩展阅读 Class-based views
Writing views
Built-in class-based generic views
URL dispatcher
本文相关源码
推荐阅读
- Django|Python接口自动化测试系列[V1.0.0][加密接口]
- Django (一)-DRF(DjangoRESTframework)工程搭建
- Django中新版本变动和版本不同的各种坑 (持续更新)
- xadmin|ImportError: No module named 'reversion'
- 解决django1.11与Python3.7不兼容问题
- Django中的auto_now、auto_now_add
- python|web开发之Django(七)(注册、登录、会话以及跳转个人中心)
- django版本和python版本的对应
- django中如何修改网页title和站点header?
- 关于django2中views和url已经前端模板页面的关系