Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
PyxYuYu opened this issue Oct 6, 2016 · 0 comments
Open

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

PyxYuYu opened this issue Oct 6, 2016 · 0 comments
Labels

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Oct 6, 2016

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 ,多继承的时候,采用广度优先的查找算法
    • 经典类 : 可以没有父类,多继承的时候,采用深度优先的查找算法
@PyxYuYu PyxYuYu added the Django label Oct 6, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant