用法一:
一个简单的需求: 在博客的主页的右侧列出所有的文章分类,当点击相应的分类的时候,列出这个分类下的所有文章.
此时,就需要用到url反向解析,Django里面的视图函数命名空间技术.
具体代码实现就是在urls.py中声明app_name:
app_name = 'blog'
之后在url匹配中添加name参数:
url(r'^category/(?P[0-9]+)/$', views.category, name='category'),
这样可以匹配 category/某个数字
在html中
此时通过blog命名空间中的名字为category的匹配项匹配到views下面的cateory函数,并把 category.pk参数传给category函数
category函数的实现为:
def category(request, pk):
cate = get_object_or_404(Category, pk=pk) #根据主键值取得分类的名字
post_list = Post.objects.filter(category=cate).order_by('-create_time')
return render(request, 'blog/index.html', context={'post_list':post_list})
根据从数据库里面取到的值重新渲染index.html模板,拿到该分类的所有文章.
用法二:
在models数据表类中定义reverse方法:
class Post(models.Model):
#标题
title = models.CharField(max_length=70)
... ...
#'blog:detail',意思是 blog 应用下的 name=detail 的函数
#于是 reverse 函数会去解析这个视图函数对应的 URL,我们这里 detail 对应的规则就是 post/(?P[0-9]+)/ 这个正则表达式,
# 而正则表达式部分会被后面传入的参数 pk 替换
def get_absolute_url(self):
return reverse('blog:detail', kwargs={'pk': self.pk})
def index(request):
#order_by 方法对这个返回的 queryset 进行排序。排序依据的字段是 created_time,即文章的创建时间。- 号表示逆序
post_list = Post.objects.all().order_by('-create_time')
return render(request, 'blog/index.html', context={'post_list':post_list})
{% for post in post_list %}
{{ post.title }}
... ...
url(r'^post/(?P[0-9]+)/$', views.detail, name='detail'),
最终会调用views.detail函数
def detail(request, pk):
post = get_object_or_404(Post, pk = pk) #根据models中reverse函数返回的pk键值查找对应的内容
post.body = markdown.markdown(post.body,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
])
return render(request, 'blog/detail.html', context={'post':post})