-
Notifications
You must be signed in to change notification settings - Fork 99
Open
Labels
Description
The outer world you see is a reflection of your inner self.
0x01 Django
- Build a Blog Application
-
Creating model managers- 每个模型默认的
managers是objects,objects可以检索所有数据库中的对象数据
- 每个模型默认的
-
我们也可以自定义
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个参数,
yearmonthdaypost - 通过给定的
slugdate可以获得单一的post
- 编辑
-
-
Adding URL patterns for your viewsURL 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.htmlbase.html包括了网站HTML的主要结构,将内容划分为主要内容区域和侧边栏区域list.html和detail.html这两个文件则继承了base.html分别显示post list和post detailDjango中的模板语言:{% 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,多继承的时候,采用广度优先的查找算法
经典类: 可以没有父类,多继承的时候,采用深度优先的查找算法
- 在