当前位置: 代码迷 >> 综合 >> django之个人博客 一
  详细解决方案

django之个人博客 一

热度:87   发布时间:2023-10-22 06:10:34.0

个人博客开发学习之路一:

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对象,而是显示namedef __str__(self):return self.type_nameclass 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中的全部博客,包括标题和文章 allcontext['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类中的一个对象,如不存在则返回404context['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的这段时间,希望在这里记录一些东西,文章借鉴敲一行代码,跟着老师边学变敲,希望记录在这里,请大家多多关照。