用法一:
一个简单的需求: 在博客的主页的右侧列出所有的文章分类,当点击相应的分类的时候,列出这个分类下的所有文章.
此时,就需要用到url反向解析,Django里面的视图函数命名空间技术.
具体代码实现就是在urls.py中声明app_name:
app_name = 'blog'
之后在url匹配中添加name参数:
url(r'^category/(?P<pk>[0-9]+)/$', views.category, name='category'),
这样可以匹配 category/某个数字
在html中
<a href="{% url 'blog:category' category.pk %}">
此时通过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<pk>[0-9]+)/ 这个正则表达式,
# 而正则表达式部分会被后面传入的参数 pk 替换
def get_absolute_url(self):
return reverse('blog:detail', kwargs={'pk': self.pk})
首先index函数会返回从数据库中取到的文章列表对象:
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})
在index.html中
{% for post in post_list %}
<article class="post post-{{ post.pk }}">
<header class="entry-header">
<h1 class="entry-title">
<a href={{ post.get_absolute_url }}>{{ post.title }}</a>
... ...
当点击标题的时候,调用Post类中的get_absolute_url 方法,该方法中的reverse函数反向解析
调用blog命名空间中名字为detail的解析项:
url(r'^post/(?P<pk>[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})
返回文章详细内容的页面,支持markdown语法解析.