美文网首页程序员
django2实战2.创建博客应用

django2实战2.创建博客应用

作者: 闲睡猫 | 来源:发表于2018-09-06 10:05 被阅读553次

    继上篇 django2实战1.初识django

    创建应用

    上篇创建了一个项目,项目相当于站点,应用即是独立的功能模块。比如:淘宝是一个完整的网站,即是一个项目。而淘宝下的聚划算属于一个应用

    在django中,一个应用是由模型、视图、模板以及url配置组成的。

    创建一个blog应用

    ☁  mysite  python manage.py startapp blog
    ☁  mysite  tree blog
    blog
    ├── __init__.py
    ├── admin.py # 将模型注册到站点管理后台
    ├── apps.py # 应用的主配置
    ├── migrations # 数据库迁移文件
    │   └── __init__.py
    ├── models.py # 模型文件,每个应用都必须有一个文件文件
    ├── tests.py # 测试文件
    └── views.py # 应用的逻辑都写在view层,包括接收http请求,处理逻辑,返回响应
    
    1 directory, 7 files
    

    文章表的字段设计

    一个博客最重要的数据就是文章,接下来我们设计文章的字段

    一篇文章的字段有:标题、摘要、作者、内容、发布时间、创建时间、更新时间、状态

    数据对应的是模型,即blog的models.py

    代码实现:

    blog/models.py

    from django.db import models
    from django.utils import timezone
    from django.contrib.auth.models import User
    
    class Post(models.Model):
        STATUS_CHOICES = (
            ('draft', 'Draft'), # 草稿
            ('published', 'Published'), # 已发布
        )
        title = models.CharField(max_length=250)
        slug = models.SlugField(max_length=250,
                                unique_for_date='publish')
        author = models.ForeignKey(User,
                                   on_delete=models.CASCADE,
                                   related_name='blog_posts')
        body = models.TextField()
        publish = models.DateTimeField(default=timezone.now)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)
        status = models.CharField(max_length=10,
                                  choices=STATUS_CHOICES,
                                  default='draft')
    
        class Meta:
            ordering = ('-publish',) # 按发布时间倒序排列
    
        def __str__(self):
            return self.title
    

    字段定义说明:

    • title: 字段定义为CharField, 对应sql中的varchar类型,max_length指定了该字段的最大长度

    • slug: url标识,文章的url格式为:yyyy/mm/dd/slug/, unique_for_date 表示slug与日期的组合是惟一的,即每篇文章的url不可重复

    • author: 文章作者,此字段是外键,与user中相关联,当user表的用户删除时,该用户发表的文章也将被删除 外键的详细说明

    • body: 文章详情,使用text类型

    • publish: 文章发布时间,默认为当前时间

    • created: 文章创建时间,auto_now_add 表示当文章创建时,会自动生成该时间

    • updated: 文章更新时间,当文章被更新时,会自动生成更新的时间

    • status: 文章状态,从STATUS_CHOICES中选取状态值

    关于字段类型的更多使用,参见官方文档

    激活应用

    根据models.py字义的字段执行数据迁移

    ☁  mysite  python manage.py makemigrations blog
    App 'blog' could not be found. Is it in INSTALLED_APPS?
    

    提示找不到blog应用,这是因为每添加一个应用,都需要到settings.py中激活

    mysite/settings.py

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'blog.apps.BlogConfig', # 注册 blog 应用
    ]
    

    生成数据库迁移文件

    ☁  mysite  python manage.py makemigrations blog
    Migrations for 'blog':
      blog/migrations/0001_initial.py
        - Create model Post
    

    执行数据迁移,此时就创建好了post数据表

    ☁  mysite  python3 manage.py migrate
    Operations to perform:
      Apply all migrations: admin, auth, blog, contenttypes, sessions
    Running migrations:
      Applying blog.0001_initial... OK
    

    开启后台

    进入后台的第一步是创建管理员

    ☁  mysite  python manage.py createsuperuser
    Username (leave blank to use 'long'): admin
    Email address: test@qq.com
    Password:
    Password (again):
    Superuser created successfully.
    

    重启webserver服务

    ☁  mysite  python manage.py runserver
    

    访问 http://127.0.0.1:8000/admin

    login

    后台主页

    admin index

    将post模型注册到后台

    blog/admin.py

    from django.contrib import admin
    from .models import Post
    
    admin.site.register(Post)
    

    刷新后台,便能看到post

    后台post页面

    点击add,添加一篇文章

    add post

    自定义文章显示字段

    mysite/blog/admin.py

    from django.contrib import admin
    from .models import Post
    
    @admin.register(Post)
    class PostAdmin(admin.ModelAdmin):
        list_display = ('title', 'slug', 'author', 'publish', 'status')
    
    
    post显示的字段

    增加可选操作

    mysite/blog/admin.py

    from django.contrib import admin
    from .models import Post
    
    @admin.register(Post)
    class PostAdmin(admin.ModelAdmin):
        list_display = ('title', 'slug', 'author', 'publish', 'status')
        list_filter = ('status', 'created', 'publish', 'author')
        search_fields = ('title', 'body')
        prepopulated_fields = {'slug': ('title',)}
        raw_id_fields = ('author',)
        date_hierarchy = 'publish'
        ordering = ('status', 'publish')
    

    搜索栏

    搜索

    侧边栏过滤选项

    过滤

    下一节将讲解如何使用django的模型查询语句。如果你感兴趣,请关注我的django2实战文集

    如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要

    相关文章

      网友评论

        本文标题:django2实战2.创建博客应用

        本文链接:https://www.haomeiwen.com/subject/djvtgftx.html