本文共 7053 字,大约阅读时间需要 23 分钟。
前文:从上期的推文中,想必大家学习到了 Django 中一些常规的操作,接下来我们继续介绍 Django 的内容
一、简介
Django 作为一个 Python 的高级 Web 框架,功能非常强大,其自身封装了大量底层逻辑,并实现了 ORM,同时,MVT 结构保证了代码结构的完整性,这一切给了开发人员巨大的便利,让 Web 开发变得高效且简洁。课程将以一个极简的博客网站为例,带领大家充分领略 Django 的魅力。
二、本课程能学到什么?
搭建完整的 Django 开发环境。
创建项目及应用。
了解项目目录下各文件的含义和作用。
了解并学会开发 Templates。
了解并学会开发 Models。
掌握 Admin 的基本配置方法。
学会项目 URL 的配置方法。
三、开始学习吧
3.5 Admin
Admin 是 Django 自带的一个功能强大的自动化数据管理界面,被授权的用户直接在 Admin 中管理数据库。Django 提供了许多针对 Admin 的定制功能。
打开命令行,输入: python manage.py createsuperyser 创建超级用户,创建名字和密码即可。(密码最好是字母加数字两种以上的字符,否则太简单会创建失败)
Admin 的入口是:localhost:8000/admin/
在应用下的 admin.py 中引入自身的 models 模块。
from django.contrib import adminfrom blog import modelsclass ArticleAdmin(admin.ModelAdmin): list_display = ("title","content","pub_time") list_filter = ("pub_time",)admin.site.register(models.Article)
进入 Admin 的登录页面,输入刚刚创建的名字和密码。
Django 管理页面如下:可对博客进行增加修改。
点击 article 进入编辑页面,可以看到在 models.py 中写的title、content、pub time。
还能添加博客,标题内容时间编辑。
3.6 博客主页面开发
首先明确博客页面需要什么?
博客主页面
博客文章内容页面
博客撰写页面
3.6.1博客主页面
在主页面中我们需要什么呢?
文章标题列表(超链接)
发表博客按钮(超链接)
首先取出数据库中所有文章对象,其次将文章对象们打包成列表,传递到前端。然后前端页面把文章以标题超链接的形式逐个列出。重点在于怎么循环文章列表。
for 循环语句:
{% for xx in xxs %}
中间内容
{% endfor %}
打开 views.py 更改 index 函数 get 改为 all,就能拿到所有的文章标题。
from django.shortcuts import renderfrom django.http import HttpResponsefrom . import modelsdef index(request):articles = models.Article.objects.all()return render (request,'index.html',{'articles':articles})打开 index.html 更改 head>++添加新文章++a>h1>{% for article in articles %}{ { article.title }}a>{% endfor %}body>html>
打开命令行,进入项目中,输入: python manage.py runsever 可运行项目。
3.6.2 博客文章内容页面
这个页面内容有三点:
文章标题
文章内容
修改文章按钮(超链接)
创建新的 article_page.html 文件。
Article Pagetitle>head> { { article.title }}h1>
{ { article.content }}
修改文章a>body>html>
打开 views.py 创建 article_page 函数,除了 reques 参数,还要添加一个 article_id 的参数作为文章标题。函数要获取通过主页面点击的文章,通过文章标题来分辨需要获取哪篇,然后返回 html 页面。
def article_page(request,article_id): article = models.Article.objects.get(pk = article_id) return render(request, 'article_page.html',{ 'article': article})
打开应用下的urls.py添加url。(?P[0-9]+)把正则表达式匹配到的数字,以article_id为组名匹配。
from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^index/$',views.index),url(r'^article/(?P[0-9]+)$',views.article_page),]
那么在 Django 页面如何写超链接呢?
{% url 'app_name:url_name' 地址参数 %}
其中app_name和url_name在url中配置的
url的名称参数:
先打开 myblog 目录下的 urls.py,在后面添加 namespace。
url(r'^blog/',include('blog.urls',namespace='blog')),
然后打开应用目录下的 urls.py ,添加 name 。
from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^index/$',views.index),url(r'^article/(?P[0-9]+)$',views.article_page,name='article_page'),]
打开 index.html 添加 url
head>++添加新文章++a>h1> {% for article in articles %} { { article.title }} a> {% endfor %}body> html>
运行页面后点击文章标题可以看到文章内容。
3.6.3 博客撰写页面
这个页面的主要内容有:
标题编辑栏
文章内容编辑区域
提交按钮
首先创建一个新的 edit_page.html 文件
Edit Pagetitle>head>
切换 views.py 添加 edit_page 函数和 edit_action 函数
def edit_page(request,article_id): if str(article_id) == '0': return render(request,'edit_page.html') article = models.Article.objects.get(pk = article_id) return render(request, 'edit_page.html',{ 'article': article}) def edit_action(request): title = request.POST.get('title','TITLE') content = request.POST.get('content','CONTENT') article_id = request.POST.get('article_id','0') if article_id == '0': #如果article_id为0 models.Article.objects.create(title=title, content=content) articles = models.Article.objects.all() return render(request, 'index.html',{ 'articles':articles}) article = models.Article.objects.get(pk = article_id) article.title = title article.content = content article.save() #修改数据后保存 return render(request, 'article_page.html',{ 'article':article})
切换到应用目录下 urls.py,添加 url
url(r'^edit/(?P[0-9]+)$',views.edit_page,name='edit_page'),url(r'^edit/action$',views.edit_action,name='edit_action'),
edit_page 函数注意事项:添加编辑文章的按钮思路与添加文章类似,但是新文章为空,修改文章有内容。修改页面有文章有对象,所以我们用已创建的文章 ID 来添加按钮。
简易的博客就这样做好啦,自行设计前端让博客变得好看吧!在这里给出全部代码进行参考。
根目录下的 urls.py
from django.contrib import adminfrom django.conf.urls import url,includefrom blog import viewsurlpatterns = [ url(r'^$',views.home), url(r'^admin/', admin.site.urls), url(r'^blog/',include('blog.urls',namespace='blog')),]
应用目录下 admin.py
from django.contrib import adminfrom blog import modelsclass ArticleAdmin(admin.ModelAdmin): list_display = ("title","content","pub_time") list_filter = ("pub_time",)admin.site.register(models.Article,ArticleAdmin)
应用目录下 models.py
from django.db import modelsimport django.utils.timezone as timezoneclass Article(models.Model): title = models.CharField(max_length=200,unique = True) content = models.TextField(max_length=2000) pub_time = models.DateTimeField(default = timezone.now) def __str__(self): return self.title
应用目录下 urls.py
from django.conf.urls import urlfrom . import viewsapp_name ='blog'urlpatterns = [ url(r'^index/$',views.index,name='blog'), url(r'^article/(?P[0-9]+)$',views.article_page,name='article_page'), url(r'^edit/(?P[0-9]+)$',views.edit_page,name='edit_page'), url(r'^edit/action$',views.edit_action,name='edit_action'), ]
应用目录下 views.py
def index(request): articles = models.Article.objects.all() comments = models.Comment.objects.all() return render(request,'index.html',locals())def home(request): return render(request,'home.html')def article_page(request,article_id): article = models.Article.objects.get(pk = article_id) return render(request, 'article_page.html',{ 'article': article})def edit_page(request,article_id): if str(article_id) == '0': return render(request,'edit_page.html') article = models.Article.objects.get(pk = article_id) return render(request, 'edit_page.html',{ 'article': article})def edit_action(request): title = request.POST.get('title','TITLE') content = request.POST.get('content','CONTENT') article_id = request.POST.get('article_id','0') if article_id == '0': models.Article.objects.create(title=title, content=content) articles = models.Article.objects.all() return render(request, 'index.html',{ 'articles':articles}) article = models.Article.objects.get(pk = article_id) article.title = title article.content = content article.save() return render(request, 'article_page.html',{ 'article': article})
index.html
Diarytitle>head> +添加新文章+a>{% for article in articles %}{ { article.title }}a> {% endfor %}body>html>
article_page.html
文章title>head> { { article.title }}h1>
{ { article.content }}h1> 修改文章a> 返回主页a>body>html>
edit_page.html
新文章title>head>
转载地址:http://gezct.baihongyu.com/