个人博客开发学习之路一:
models:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
#由于代码从上往下执行 Blog关联BlogType 所以这里BlogType要在前面创建
class BlogType(models.Model):
type_name = models.CharField(verbose_name='博客类型',max_length=15)
#这个函数会在后台,我们看到的不是这个BlogType对象,而是显示name
def __str__(self):
return self.type_name
class Blog(models.Model):
title = models.CharField(max_length=50,verbose_name='标题')
#博客类型和博客这里设置为一对一关系
blog_type = models.ForeignKey(BlogType,on_delete=models.DO_NOTHING,verbose_name='博客类型')
content = models.TextField(verbose_name='内容',default=None)
author = models.ForeignKey(User,on_delete=models.DO_NOTHING,verbose_name='用户名')
created_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
last_updated_time = models.DateTimeField(auto_now=True,verbose_name='最后更新时间')
#当创建一个新的博客之后,会显示博客标题
def __str__(self):
return "<Blog: %s>" % self.title
,这里先创建博客的标签类型和博客两个模型,其中博客类型(标签)和博客是一对多关系,注意使用外键关联。
这里文章的作者继承django中自带的User,注意导入,同样使用外键关联,一对多关系,on_delete=models.DO_NOTHING表示当文章被删除时,保留作者不被删除,文章类型同理。接下来创建视图函数。
views:
from django.shortcuts import render_to_response ,get_object_or_404
from .models import Blog, BlogType
# Create your views here.
def blog_list(request):
context = {}
#返回Blog中的全部博客,包括标题和文章 all
context['blogs'] = Blog.objects.all()
#返回blog中的全部博客,然后计算数目 也可以使用框架的方法{{ blogs |length }} 直接计算
#context['blogs_count'] = Blog.objects.all().count()
return render_to_response('blog_list.html',context)
def blog_detail(request,blog_pk):
context = {}
#找BLog类中的一个对象,如不存在则返回404
context['blog'] = get_object_or_404(Blog, pk = blog_pk)
return render_to_response('blog_detail.html',context)
def blog_with_type(request,blog_type_pk):
context = {}
#得到一个BlogType中的一个类型
blog_type = get_object_or_404(BlogType,pk=blog_type_pk)
context['blogs'] = Blog.objects.filter(blog_type=blog_type)
#上面筛选Blog对象中的blog_type字段,
context['blog_type'] = blog_type
#这里我们需要在模板中展示博客类型 所以传入博客类型,已备后面blog_with_type.html使用
return render_to_response('blog_with_type.html', context)
这里先创建返回三个页面,主页面blog_list,在主路由中设置为主页面,博客内容详情blog_detail,标签类别包括的博客blog_with_type。这里需要注意Blog.objects.all()方法和get_object_or_404()方法,一个返回类中所有的对象,一个返回一个对象。Blog.objects.filter()筛选出所有对象中包含的某个字段。最后需要三个HTML页面设置返回视图。目前并没有使用模板。
主页面:
<head>
<meta charset="UTF-8">
<title>我的个人网站</title>
</head>
<body>
<title>我的个人网站</title>
<div>
<a href="{% url 'home' %}">
<h3>个人博客网站</h3>
</a>
</div>
<hr>
{% for blog in blogs %}
<a href="{% url 'blog_detail' blog.pk %}">
<h3>{{ blog.title }}</h3>
</a>
<p>{{ blog.content|truncatechars_html:30 }}</p>
{% empty %}
<p>--*目前没有博文,敬请期待*--</p>
{% endfor %}
<p>总共有{{ blogs |length }}篇博文</p>
</body>
博客内容页面:
<head>
<meta charset="UTF-8">
<title>{{ blog.title }}</title>
</head>
<body>
<div>
<a href="{% url 'home' %}">
<h3>个人博客网站</h3>
</a>
</div>
{# |筛选器 #}
<h3>{{ blog.title }}</h3>
<p>作者:{{ blog.author }}</p>
<p>文章类型:
<a href="{% url 'blog_with_type' blog.blog_type.pk %}">
{{ blog.blog_type }}
</a>
</p>
<p>发表日期:{{ blog.created_time |date:'Y-m-d H:i:s' }}</p>
<p>最后修改时间:{{ blog.last_updated_time|date:'Y-n-d G:i:s' }}</p>
<p>{{ blog.content }}</p>
</body>
</html>
分类界面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ blog_type.type_name }}</title>
</head>
<body>
<div>
<a href="{% url 'home' %}">
<h3>个人博客网站</h3>
</a>
</div>
<hr>
<h3>{{ blog_type.type_name }}</h3>
{# 这里blogs是所有的博客类型,因为BlogType类和Blog关联,且类型和文章是一对多关系 #}
{# 所以这里用for循环 展示该类型下的所有文章 #}
{% for blog in blogs %}
<a href="{% url 'blog_detail' blog.pk %}">
<h3>{{ blog.title }}</h3>
</a>
<p>{{ blog.content|truncatechars_html:30 }}</p>
{% empty %}
<p>--*目前没有博文,敬请期待*--</p>
{% endfor %}
<p>总共有{{ blogs |length }}篇博文</p>
</body>
</html>
注意设置路由:
子路由:
from django.urls import path
from .import views
#app_name = 'blog'
urlpatterns = [
#连接到文章
path('<int:blog_pk>/', views.blog_detail, name='blog_detail'),
#连接到类型
path('type/<int:blog_type_pk>',views.blog_with_type, name ='blog_with_type'),
]
总路由:
from django.contrib import admin
from django.urls import include, path
from blog.views import blog_list
urlpatterns = [
path('', blog_list, name='home'),
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
后台管理装饰器:
from django.contrib import admin
from .models import BlogType, Blog
# Register your models here.
@admin.register(BlogType)
class BlogTypeAdmin(admin.ModelAdmin):
list_display = ('id','type_name')
@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
list_display = ('id','title','blog_type','author','created_time','last_updated_time')
对了,不要忘记设置添加app:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
学习django的这段时间,希望在这里记录一些东西,文章借鉴敲一行代码,跟着老师边学变敲,希望记录在这里,请大家多多关照。