Skip to content

Django学习记录(十一):Django by example -- Blog(七) #47

@PyxYuYu

Description

@PyxYuYu

The outer world you see is a reflection of your inner self.

0x01 Django

  • Build a Blog Application
    • Creating model managers

      • 每个模型默认的 managersobjectsobjects 可以检索所有数据库中的对象数据
    • 我们也可以自定义 managers,这里自定义一个 manager 用于检索所有公开状态的 posts

    • 两种自定义方法:

      • 继承默认的 managers 创建一个新的 managers
      • 编辑 models.py,添加
        class PublishedManager(models.Manager):
            def get_queryset(self):
                return super(PublishedManager, self).get_queryset().filter(status='published')
      
        class Post(models.Model):
            # ...
            objects = models.Manager()
            published = PublishedManager()
      • 另一种方法就是在原始 managers 中添加新的方法
    • Creating list and detail views

      • 创建一个视图用于显示 posts 列表

        • 编辑 views.py,添加
           from django.shortcuts import render, get_object_or _404
           from .models import Post
        
           def post_list(request):
               posts = Post.published.all()
               return render(request, 'blog/post/list.html', {'posts': posts})
        • post_list() 中有一个参数 request, 所有视图都需要这个参数
        • 返回一个 HttpResponse 对象
      • 创建一个视图用于显示单一的 post 内容

        • 编辑 views.py ,添加
           def post_detail(request, year, month, day, post):
               post = get_object_or_404(Post, slug=post,
                                              status='published', 
                                              publish_year=year, 
                                              publish_month=month, 
                                              publish_day=day)
               return render(request, 'blog/post/detail.html', {'post': post})
        • 这个视图需要4个参数,year month day post
        • 通过给定的slug date 可以获得单一的 post
    • Adding URL patterns for your views

      • URL patterns 用正则表示
      • blog 目录下创建 urls.py 文件
         from django.conf.urls import url
         from . import views
      
         urlpatterns = [
             # post views
             url(r'^$', views.post_list, name='post_list'), 
             url(r'^(?P<year>\d{4})/(?P<month>\d{2}/(?P<day>\d{2})/(?P<post>[-\w]+)/$', 
                 views.post_detail, name='post_detail'),
         ]
      • 第一个 URL pattern 没带任何参数,映射的就是 post_list 视图
      • 第二个 URL pattern 带了4个参数,映射的就是 post_detail 视图
      • 注意:让其他项目也可以利用这些 app 的最好方法就是为每个 app 创建 urls.py
      • 接下来,需要将 blog 这个应用的 URL patterns 代入到项目的 URL patterns
      • 编辑 mysite 文件夹下的 urls.py
         from django.conf.urls import url, include
         from django.contrib import admin
      
         urlpatterns = [
             url(r'^admin/', include(admin.site.urls)), 
             url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')), 
         ]
    • Canonical URLs for models

      • post_detail 中的 URL 来规范 Post 中的 URL
      • Django 中规范的方法就是 添加一个 get_absolute_url() 方法到模型中
      • get_absolute_url() 方法中用 reverse() 方法来创建 URLs
      • 编辑 models.py
        from django.core.urlresolvers import reverse
      
        Class Post(models.Model):
            # ...
            def get_absolute_url(self):
                return reverse('blog:post_detail', 
                                args=[self.publish.year, 
                                      self.publish.strftime('%m'), 
                                      self.publish.strftime('%d'), 
                                      self.slug])
      • 此处用了 strftime() 方法,前面可以有0的存在(不会忽略数字之前的零)
    • Creating templates for your views

      • 创建 html 模板来显示 posts
      • blog 文件夹下创建 templates,如下逐层创建
        templates/
            blog/
                base.html
                post/
                    list.html
                    detail.html
      
      • base.html 包括了网站 HTML 的主要结构,将内容划分为主要内容区域和侧边栏区域
      • list.htmldetail.html 这两个文件则继承了 base.html 分别显示 post listpost detail
      • Django 中的模板语言: {% tag %} {{ variable }} {{ variable|filter }}
      • 编辑 base.html
        {% load staticfiles %}
        <!DOCTYPE html>
        <html>
        <head>
          <title>{% block title %}{% endblock %}</title>
          <link href="{% static "css/blog.css" %}" rel="stylesheet">
        </head>
        <body>
          <div id="content">
            {% block content %}
            {% endblock %}
          </div>
          <div id="sidebar">
            <h2>My blog</h2>
              <p>This is my blog.</p>
          </div>
         </body>
         </html>
      • {% load staticfiles %} : 告诉 Django 导入静态文件中的模板标签(由 django.contrib.staticfiles 提供),导入之后,就可以在这个模板中使用 {% static %}
        • 如果在 manage.py 同级目录中创建 static 文件夹,则需要在 setting.py 中添加:
        • STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )
      • {% block %} : 在此处定义了一个 block ,上面定义了两个,一个命名为 title ,另一个是 content
0x02 Python

  • 普通继承super继承
    • super继承 机制中可以保证公共父类仅被执行一次
    • super继承 只能用于新式类,用于经典类会报错
      • 新式类 : 必须有继承的类,如果没有想继承的,那就继承 object ,多继承的时候,采用广度优先的查找算法
    • 经典类 : 可以没有父类,多继承的时候,采用深度优先的查找算法

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions