django之个人博客 一

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

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的这段时间,希望在这里记录一些东西,文章借鉴敲一行代码,跟着老师边学变敲,希望记录在这里,请大家多多关照。

猜你喜欢

转载自blog.csdn.net/qq_34935726/article/details/82318264
今日推荐